在descructor中传入指针的释放

时间:2017-06-01 13:48:14

标签: c++

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中分配它。

2 个答案:

答案 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指针没有影响。