我正在尝试删除子类的对象。虽然我使用了虚拟析构函数,但我仍然收到错误消息:
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;
}
如果有人帮助过我,我会非常感激!
答案 0 :(得分:1)
@songyuanyao是对的:delete dog
而不是delete &dog
。您已分配了地址存储在dog
中的内存。 &dog
是的地址,其中存储该地址,可能在堆栈上。所以&dog
是Mammal **
,你没有new
,而是由编译器在堆栈上自动创建的。由于您没有new
,因此您无法delete
。
顺便说一下,如果要查看虚拟析构函数的效果,请使用Animal *dog = new Mammal();
。由于您将dog
声明为Mammal
并将其创建为Mammal
,因此无论是否为虚拟析构函数,都会调用正确的析构函数。
答案 1 :(得分:0)
您分配了Mammal*
,然后删除了指向堆栈的Mammal**
。不允许删除堆栈中的内容。
delete dog;
是对的。