delete 对象指针时,为什么要准确的类的指针

2020-07-14  本文已影响0人  xiaoliang1

其实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的析构函数。

上一篇下一篇

猜你喜欢

热点阅读