这个问题很多人都在问,很多人有不同答案,有一点是可以肯定,就是千万别在析构函数中调用delete this,因为会造成死递归(delete this调用后会再次调用析构函数,再次delete this...),但是如果在其他地方调用delete this会不会出问题?有种说法是只要你delete this 后不再使用任何该类的成员变量调用该类的任何成员函数不会有问题。这看起来也确实比较符合逻辑。但是任何事一定要亲身测试才能知道真相。邓小平同志说过实践是检验真理的唯一标准。最近项目中恰好我就用了一下这个特性,结果是delete this在任何地方都会有问题。
我是在vs2008下开发的,项目中由于不能用boost(领导吐槽boost太大了),vs2008下只支持c++98标准还不支持c++11以后特性(智能指针和多线程等模块c++11以后才纳入标准库中)但是程序中一大堆指针,很难管理,于是我自己写了一套智能指针shared_ptr和unique_ptr,由于shared_ptr中需要引用计数,其中有一句话是:
if(ref_count<=0)
{
delete this;
}
这句话的意思是就是如果引用计数为0就删除该ref_manager,我用引用计数管理器托管引用计数,ref_manager存在于heap上这样才能传递给其他ptr修改计数且内存中只存在一份。但是运行以后我发现会崩溃,我把以上那句代码注释,改成在外面shared_ptr中delete它就正常了(这也是合乎逻辑的,本来就应该是使用者来控制消亡)我也是故意想验证一下delete this是否可行,由此得出结论我在vs2008下编译出的代码delete this是有问题的。不知道高版本的vs中有没有,因为可能高版本的vs微软优化了编译器的前端就没这个问题了。