为什么这个虚拟析构函数在 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;
正确。
我正在尝试删除子类的对象。虽然我使用了虚拟析构函数,但我仍然收到错误消息:
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;
正确。