class A
{
public:
A(){ };
~A(){ };
//stuff
};
class B
{
public:
B(A* a){ pA = a;}
~B(){ };
A* pA;
};
int main()
{
A instOfA = A();
B instOfB = B(&instOfA);
return 0;
}
我不确定~B()是否应删除其指针数据成员* pA。即
~B()
{
if(pA!=nullptr) delete pA;
}
我的猜测是需要删除,因为B正在A * pA中分配它。
答案 0 :(得分:0)
这完全是关于所有权,因此问题是一个设计问题。你不是动态分配A所以我不会让B触摸它。它将在主页末尾删除。
如果要动态分配A的实例(A* instOfA = new A();
),然后您可以选择是否要将该实例的所有权传递给B并让B删除它。
我的猜测是需要删除,因为B正在A *中分配它 PA中。
你的猜测不对。 B没有分配A.它所做的就是获取在main中分配的实例的指针。
答案 1 :(得分:0)
你猜是不正确的,因为
B instOfB = B(&instOfA);
将A
自动存储持续时间的地址传递给B
的构造函数。运算符delete
只能安全地用于销毁使用相应运算符new
创建的对象。使用运算符delete
来销毁未使用相应运算符new
创建的对象会产生未定义的行为。
instOfA
返回时, main()
保证不再存在,因此不需要采取任何措施来销毁它。任何导致它被销毁两次的动作(因此它的析构函数在同一个对象上被调用两次)也会产生不确定的行为。
一般来说,设计班级B
通常会更好,因此它会完全管理A
(例如管理其生命周期)以确保一致性。通过接受指针,不可能阻止(除了通过强制文档,并依赖程序员注意文档)一个对象被传递给析构函数无法正确处理的构造函数。
如果您要执行delete pA
,则无需测试pA
是否为非NULL。该标准指定delete
运算符对NULL
指针没有影响。