关于delete this

#include "stdio.h"

class Test
{
public:
    Test()
    {
        ptr = new int;
        printf("Test construct -- %p\n", ptr);
    }

    ~Test()
    {
        // delete this的时候,调用析构函数时this空间还没释放掉,因此这里对对象资源还可以使用。
        delete ptr;
        ptr = NULL;
        printf("Test destruct -- %p %p\n", this, ptr);
    }

    void deletePtr()
    {
        delete ptr;
        ptr = NULL;
        printf("Test destruct -- %p %p\n", this, ptr);
    }

    void show()
    {
        printf("Test show\n");
    }

    // 是可以在类的成员函数中调用delete this的,这个就相当于释放了对象资源,释放完毕后是可以正常返回调用位置的,因为本质上他就是调用了一个函数,然后this作为一个隐藏指针传递给了func();但是要留意delete之后,就不能再使用该对象的资源了。
    void func()
    {
        printf("func1 -- %p\n", this);

        // delete this之后,不能在使用成员变量和虚函数相关的数据,对于程序是否可以正常运行,这个是不需要考虑的,这个本质上和函数调用以及C++中类的实现有关,不论是虚函数还是普通的成员函数,本质上他就是一个函数,发生函数调用时,编译器会将返回地址设置到调用位置,在返回时会通过这个信息跳转回到原本的函数调用位置,这个和对象数据空间是没有关系的;而C++类中,对象数据和类的函数是分开的,包括虚函数,不会说释放掉对象之后,函数代码也一同被删除掉。
        // 因此,delete this是可以的,但是要注意delete this后就禁止再使用对象资源(类资源和对象资源是两个概念,这个要注意)
        delete this;

        // deletePtr();

        // 这里delete this后,对应的this对象空间被释放掉,原先的ptr也就没有了意义。如上面分别调用delete this和deletePtr,前者delete之后,ptr输出会有输出非NULL的情况,本质上就是this指向的堆空间被另外使用,于是ptr中的内容被修改。
        printf("func2 -- %p %p\n", this, ptr);
    }

private:
    int *ptr;
};

int main(int argc, char* argv[])
{
    Test *test = new Test;
    test->func();

    // 这个就和C++编译器关联上了,对象的数据部分和函数表部分实际是两个部分,因此这里可以在没有实际创建空间的时候调用一个成员函数且可以正常执行程序。
    // 调用成员函数只是向该成员函数传递一个隐藏的this指针。
    Test *test2;
    test2->show();

    
    return 0;
}
posted @   呵哈呵  阅读(84)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示