【问题标题】:Why does this virtual destructor does not work in C++? [closed]为什么这个虚拟析构函数在 C++ 中不起作用? [关闭]
【发布时间】:2026-02-19 13:45:02
【问题描述】:

我正在尝试删除子类的对象。虽然我使用了虚拟析构函数,但仍然收到错误消息:

malloc: *** error for object 0x7ffee08bab50: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

我的代码是:

#include <iostream>

using namespace std;

class Animal{
  protected:
    int age;
  public:
    Animal(){
      age = 0;
      cout << "ctor Animal" << endl;
    }
    virtual ~Animal(){
      cout << "dtor Animal" << endl;
    }
};

class Mammal : public Animal{
  public:
    Mammal(){
      age = 0;
      cout << "ctor Mammal" << endl;
    }
    ~Mammal(){
    cout << "dtor Mammal" << endl;
    }
};

int main(){
  Mammal *dog = new Mammal();
  delete &dog;
}

如果有人帮助我,我将非常感激!

【问题讨论】:

  • 你应该delete dog;
  • 投票关闭,因为简单的错字。
  • 欢迎来到本站!查看tourhow-to-ask page 了解更多关于提出问题以吸引高质量答案的信息。如果评论者询问,您可以edit your question 提供更多信息。如果您的问题确实解决了,请不要担心 - 这不是个人问题 :)。

标签: c++ virtual destructor


【解决方案1】:

@songyuanyao 是对的:delete dog 而不是delete &amp;dog。您已分配地址存储在dog 中的内存。 &amp;dog存储该地址的地址,可能在堆栈上。所以&amp;dog 是一个Mammal **,你没有new,而是由编译器在堆栈上自动创建的。既然你没有new它,你就不能delete它。

顺便说一句,如果你想看看虚拟析构函数的效果,使用Animal *dog = new Mammal();。由于您将 dog 声明为 Mammal 并将其创建为 Mammal,因此无论它是否是虚拟的,都会调用正确的析构函数。

【讨论】:

  • 感谢您的快速答复! :)
【解决方案2】:

您分配了一个Mammal*,然后删除了一个指向堆栈的Mammal**。不允许删除堆栈中的内容。

delete dog;

是正确的。

【讨论】:

  • 感谢您的快速答复! :)