在析构函数调用中删除

时间:2014-10-31 08:20:08

标签: c++ destructor delete-operator

在以下代码中:

class Base {
public:
    virtual ~Base(){}
};

class Derived : public Base
{
    Derived* d;

public:
    ~Derived()
    {    
        delete d;
    }
    Derived():d(NULL){}
};


int main()
{
    Base* b = new Derived;
    delete b;
    return 0;
}

Derived析构函数中的调用delete d;是否会导致析构函数调用中的递归?

2 个答案:

答案 0 :(得分:1)

实际上没有,除了main中的析构函数之外,没有任何析构函数的调用。

Reference on delete

  

如果expression不是空指针,则删除表达式将调用   析构函数(如果有的话)用于被销毁的对象,或用于   数组的每个元素都被销毁(从最后一个开始)   元素到数组的第一个元素。)

这使我认为由于d为NULL,因此不会调用析构函数。删除将执行但将返回而不执行任何重要操作。

通过在每个析构函数中添加std::cout语句

,这非常容易测试

答案 1 :(得分:1)

析构函数

 Derived::~Derived() {    
        delete d;
   }

不属于递归,因为d是指向不同Derived对象的指针,与此(当前对象)不同,所以即使Derived::~Derived()被调用,也会调用另一个对象,并最终在d时停止在链中的某处是NULL。