将未引用的对象作为参数传递到函数中可以吗



下面是我思考的一个非常快速的例子。

// 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将使用引用计数来计算何时不再有对指向对象的引用,当该引用计数为零时,指向对象将被删除。

最新更新