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在所述对象上将证明是有问题的.但事实并非如此.
删除只是释放内存(也调用析构函数).基本上你使用垃圾this指针调用dev ,它只能因为dev不是虚拟的而且它不会尝试访问任何成员变量,否则它可能会像使用任何其他无效指针一样访问违规.