C++ 在描述器中取消分配传入的指针
我不确定~B()是否应该删除其指针数据成员*pAC++ 在描述器中取消分配传入的指针,c++,C++,我不确定~B()是否应该删除其指针数据成员*pA 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(&instOf
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在a*pA中分配它。这都是关于所有权的问题,因此问题是设计问题。你没有动态分配A,所以我不会让B碰它。它将在主菜单的末尾被删除 如果要动态分配的实例(
A*instOfA=new A();
),然后您可以选择是否要将该实例的所有权传递给B并让B删除它
我的猜测是需要删除,因为B正在a中分配它*
宾夕法尼亚州
你的猜测不对。B没有分配A。它所做的只是获取在main中分配的实例的指针。您的猜测是不正确的,因为
~B()
{
if(pA!=nullptr) delete pA;
}
将自动存储持续时间A
的地址传递给B
s构造函数。操作员delete
只能安全地用于销毁使用相应操作员new
创建的对象。使用运算符delete
销毁未使用相应运算符new
创建的对象会产生未定义的行为
当main()
返回时,instOfA
保证不再存在,因此不需要采取任何措施来销毁它。任何导致它被销毁两次的操作(因此它的析构函数在同一个对象上被调用两次)也会给出未定义的行为
一般来说,最好设计类B
,使其完全管理A
,以确保一致性。通过接受指针,就不可能防止(除了通过尖锐的文档和依赖程序员注意文档之外)将析构函数无法正确处理的对象传递给构造函数
如果要执行
delete pA
,则无需测试pA
是否为非空。该标准规定delete
运算符对NULL
指针没有影响。您必须问自己的问题是:B
是否拥有B::pA指向的对象指针代码>?在本例中,它指向instOfA
,这是main()
中的一个局部变量。局部变量始终属于其作用域。您只删除了分配给new
的内容。我猜需要删除,因为B在a*pA中分配它。B
的构造函数在您的示例中没有分配任何内容。这是(原因之一)为什么应该避免使用原始指针,而是使用引用和智能指针:它们更明确地说明了所有权。
B instOfB = B(&instOfA);