#include<bits/stdc++.h>
using namespace std;
class A {
public :
~A(){
cout << " A is destroyed " << endl;
}
};
class B : public A
{
public :
~B(){
cout << " B is destroyed " << endl;
}
};
int main()
{
B obj;
B * p = &obj;
delete p;
return 0;
}
在main函数中,我创建了只有一个B类的对象,它继承了A类。 当我使用指针删除该对象时,析构函数被调用并打印消息然后,我无法理解为什么析构函数被称为两次?
答案 0 :(得分:11)
因为堆栈上有变量,所以析取函数会在作用域的末尾自动调用。
B obj; // <- Constructor called.
B * p = &obj;
delete p; // <- Bad, undefined behaviour, but destructor called.
return 0; // <- Destructor called as `obj` goes out of scope.
您已使用此行导致未定义的行为:
delete p;
请记住,您应该只删除已明确创建的内存(即使用new
)。
答案 1 :(得分:3)
执行行delete p;
时首次调用析构函数。第二次 - 当B obj;
超出main
答案 2 :(得分:3)
如果您像在这种情况下那样在堆栈中创建对象,则不应在其上调用delete。 该对象将在范围的末尾自动销毁(封闭})。 要回答你的问题,调用delete会导致调用析构函数两次