下面是我思考的一个非常快速的例子。
// Example program
#include <iostream>
#include <string>
class Obj
{
private:
int myInt;
public:
Obj()
{
myInt = 0;
}
~Obj()
{}
void increment()
{
myInt++;
}
int getInt()
{
return myInt;
}
};
class A
{
public:
Obj* myObj;
A()
{
myObj = nullptr;
}
~A()
{
if(myObj)
{
delete myObj;
myObj = nullptr;
}
};
void myFunc(Obj* o)
{
myObj = o;
}
};
int main()
{
A* a = new A();
a->myFunc(new Obj());
a->myObj->increment();
delete a;
}
只是一个假设。。。。关于上述代码,特别是行
a->myFunc(new Obj());
它编译得很好,但这样做在功能上有什么问题吗?除了糟糕的状态,或者违背最佳实践之外?
代码的一个重要问题是它非常脆弱且容易出错。
例如,如果有两个类A的实例,它们指向相同的Obj
实例,会发生什么?
假设其中一个A实例被删除。然后myObj
所指向的对象被销毁。但现在A的另一个实例有一个原始指针,它指向一个不再有效的内存。
假设共享所有权语义,存储对象指针的更好方法是使用类似std::shared_ptr
的智能指针。
例如,在class A
中,将原始指针Obj* myObj
替换为类似std::shared_ptr<Obj>
的智能指示器,并且不要从a的析构函数显式调用delete myObj
。相反,让std::shared_ptr
的析构函数自动处理智能指针数据成员的删除。在幕后会发生的事情是,shared_ptr
将使用引用计数来计算何时不再有对指向对象的引用,当该引用计数为零时,指向对象将被删除。