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

时间:2018-03-24 14:18:14

标签: c++ virtual destructor

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

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

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

2 个答案:

答案 0 :(得分:1)

@songyuanyao是对的:delete dog而不是delete &dog。您已分配了地址存储在dog中的内存。 &dog的地址,其中存储该地址,可能在堆栈上。所以&dogMammal **,你没有new,而是由编译器在堆栈上自动创建的。由于您没有new,因此您无法delete

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

答案 1 :(得分:0)

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

delete dog;

是对的。