在以下代码中:
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;
是否会导致析构函数调用中的递归?
答案 0 :(得分:1)
实际上没有,除了main中的析构函数之外,没有任何析构函数的调用。
如果expression不是空指针,则删除表达式将调用 析构函数(如果有的话)用于被销毁的对象,或用于 数组的每个元素都被销毁(从最后一个开始) 元素到数组的第一个元素。)
这使我认为由于d为NULL,因此不会调用析构函数。删除将执行但将返回而不执行任何重要操作。
通过在每个析构函数中添加std::cout
语句
答案 1 :(得分:1)
析构函数
Derived::~Derived() {
delete d;
}
不属于递归,因为d是指向不同Derived对象的指针,与此(当前对象)不同,所以即使Derived::~Derived()
被调用,也会调用另一个对象,并最终在d时停止在链中的某处是NULL。