【问题标题】:Creating only one object, still Destructor is called 2 times . Why?只创建一个对象,仍然调用 Destructor 2 次。为什么?
【发布时间】:2016-08-19 20:53:01
【问题描述】:
#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;
}

在主函数中,我只创建了 B 类的 一个 对象,它继承了 A 类。 当我使用指针删除该对象时,调用析构函数并打印消息但是,我无法理解为什么析构函数被称为 twice

【问题讨论】:

  • 你应该发布程序的输出。
  • @BiagioFesta:在这种情况下那将毫无意义。再说了,那些鼻魔怎么贴?
  • 您可能也应该在A 中定义一个virtual destructor,尽管我认为这与您当前的问题无关。
  • 这是格式错误的代码:尝试 delete 指向局部变量的指针是一个非常糟糕的主意。
  • 解决此类问题的正确工具是使用调试器,但在这样做之前不要在 Stack Overflow 询问。告诉我们您在逐行检查代码时所做的所有观察。您也可能想阅读How to debug small programs (by Eric Lippert)] 至少给我们留下一个 minimal reproducible example 来重现您的问题。 (这是πάνταῥεῖ™提供的个人股票评论)

标签: c++


【解决方案1】:

因为你在栈上有一个变量,所以在作用域结束时会自动调用析构函数。

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)。

【讨论】:

  • 你的意思是当我用“delete”关键字删除一个对象时,它的内存还有空间吗?
  • @NeerPatel 不,我的意思是这样做会导致未定义的行为。你不应该delete你没有new
  • 好的。知道了。我几乎明白你在说什么。但还是想听听你的意见。这是否意味着,在 Heap 部分(动态分配)中分配的所有对象都可以使用“delete”关键字删除。但是存储在 stack 部分的对象不会通过使用“delete”关键字删除?
  • @NeerPatel 使用 new 关键字初始化的对象可以使用 delete 关键字销毁,这包括放置 new 等尝试删除不是 newed 的东西 @987654329 @ 关键字会导致未定义的行为,它可能会崩溃(段错误),它可能会起作用,甚至可能会偷你的车。 未定义的行为 未定义 ....
  • @NeerPatel 没问题,如果这回答了您的问题,请记得标记为正确。
【解决方案2】:

在执行delete p; 行时第一次调用析构函数。第二次 - 当B obj; 超出您的main 范围时

【讨论】:

    【解决方案3】:

    如果您像在这种情况下那样在堆栈中创建一个对象,则不应对其调用 delete。 该对象将在范围结束时自动销毁(封闭})。 回答你的问题调用删除导致调用析构函数两次

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      相关资源
      最近更新 更多