在g ++中删除此指针行为

cpp*_*eak 2 c++ gcc this-pointer

#include <stdio.h>

class Foo {

        public:
                Foo(char x);
                Foo(char x, int y);
                ~Foo();
                void abc();
                void dev();
};

void Foo::dev()
{

        printf("inside dev \n");
}

void Foo::abc()
{

        printf("inside abc \n");
        delete this;
        dev();
}

Foo::Foo(char x)
{

      printf("inside 1 argu const---------------");

}

Foo::~Foo()
{

    printf("inside 1 argu dest---------------");
}

#include "test.h"

int main()
{

        Foo *obj=new Foo('a');
        printf("%u inside main\n", obj);
        obj->abc();
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

在查看程序的输出之后,似乎仍然调用"dev"函数,尽管在调用dev之前在函数abc中调用了"delete this"?gcc/g ++如何处理这个?

jld*_*ont 12

对象可能仍然可用于未定义的时间.此外,delete不会影响有问题的指针.

Delete只需在对象实例上调用析构函数.Delete将内存返回到池但是未定义(和运行时相关)关于何时重用此内存(如果有的话).该对象可以在程序的剩余时间内使用,但重点是:不要指望它.

有一个不太明显的陷阱需要注意:对象无法知道它是否是动态分配的.因此,如果对象被静态分配调用,则delete this在所述对象上将证明是有问题的.但事实并非如此.


Rud*_*ddy 6

删除只是释放内存(也调用析构函数).基本上你使用垃圾this指针调用dev ,它只能因为dev不是虚拟的而且它不会尝试访问任何成员变量,否则它可能会像使用任何其他无效指针一样访问违规.