美文网首页
delete 对象指针时,为什么要准确的类的指针

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

作者: xiaoliang1 | 来源:发表于2020-07-14 20:38 被阅读0次

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

    相关文章

      网友评论

          本文标题:delete 对象指针时,为什么要准确的类的指针

          本文链接:https://www.haomeiwen.com/subject/wtxqhktx.html