只创建一个对象,Destructor仍被调用2次。为什么?

时间:2016-08-19 20:53:01

标签: c++

#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类。 当我使用指针删除该对象时,析构函数被调用并打印消息然后,我无法理解为什么析构函数被称为两次

3 个答案:

答案 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会导致调用析构函数两次