C++ 在描述器中取消分配传入的指针

C++ 在描述器中取消分配传入的指针,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

我不确定~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(&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);