为什么这个虚拟析构函数在 C++ 中不起作用?

Why does this virtual destructor does not work in C++?

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

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;
}

如果有人帮助我,我将不胜感激!

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

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

您分配了一个 Mammal* 然后删除了一个指向堆栈的 Mammal**。不允许删除堆栈上的东西。

delete dog;

正确。