假设我有一个A级
class A {
public:
A(){};
~A(){};
bool foo(int);
};
bool A::foo(int i){
if(i==10){
delete this;
return true;
}
return false;
}
int main(){
A *pnt = new A();
if(pnt->foo(10)){
cout<<"deleted with foo"<<endl;
}
else{
delete pnt;
}
return 1;
}
这是好的还是未定义的行为,foo将返回true?
我在询问“delete this;
”之后会员函数会发生什么。
答案 0 :(得分:1)
我在draft中搜索了当前标准,并阅读了评论和常见问题解答中引用的question。
我找不到任何说明此代码会导致未定义行为的元素。
标准说:
this
在上面的代码中是正确的由于代码不在对象的已分配部分中,并且在delete this
之后,代码仅使用常量值true
,因此代码没有理由通向UB。常见问题解答(以及ref ed 问题的答案)清楚地表明delete this
是有效且惯用的C ++。
因此没有理由不执行return true
。
话虽如此,对于delete this
程序员的任何其他用法,必须确保仅在分配有new的对象上使用它,因为如果不是它确实是UB。
答案 1 :(得分:1)
据我所知'删除这个'会使this指针指向的对象无效。
因此,使用任何成员变量都是未定义的;并且你不能调用虚拟(多态)函数(因为你不再有vtable)。但是,您可以执行其他任何需要包含的内容(如在您的情况下)返回值。