其实void * 也可以,只不过有弊端。
经反汇编代码查看,这都是编译器在作怪,由于是静态编译,他不会认为这是个类,所以不会调用类的析构函数,而你要在析构函数里进行一些操作,成员变量指针释放可能由自己成员变量指针指向的堆区数据。如果不调用析构函数,就会造成内存泄漏。然后,这类占用的堆内存,会正常释放,所以造成了,成员变量指针指向的堆区数据,也就永远无法被释放了。
所以,正常情况下,没有成员变量指向堆区数据,可以用 delete Void* 类型指针。
最后,你用什么类型的指针 去接一个对象;在delete 这个类型的指针,他就会调用什么类的析构函数,即使不是这个真正的类的析构函数。
class Person
{
public:
int a = 10;
Person();
~Person();
private:
};
Person::Person()
{
printf("%s\n", __FUNCSIG__);
}
Person::~Person()
{
printf("%s\n", __FUNCSIG__);
}
class Person1
{
public:
Person1();
~Person1();
private:
};
Person1::Person1()
{
printf("%s\n", __FUNCSIG__);
}
Person1::~Person1()
{
printf("%s\n", __FUNCSIG__);
}
int main()
{
Person* p = new Person;
Person1* p1 = (Person1*)p;
printf("0x%x\n", &(*p));
delete p1;
std::cout << "Hello World!\n";
}
结果:
__thiscall Person::Person(void)
0x80f598
__thiscall Person1::~Person1(void)
Hello World!
C:\Users\admin\source\repos\ConsoleApplication25\Debug\ConsoleApplication25.exe
(进程 6908)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自
动关闭控制台”。
按任意键关闭此窗口. . .
最后却调用了Person1的析构函数。
网友评论