Return 删除后的值;
Return value after delete this;
假设我有一个 class 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 会 return 为真是未定义的行为?
我问的是“delete this;
”之后的成员函数发生了什么。
我在评论和常见问题解答中引用的 draft for current standard and also read the question 中进行了搜索。
我找不到任何说明此代码会导致未定义行为的元素。
标准说:
- delete操作数的值可能是空指针
值,指向由先前的 new 表达式创建的非数组对象的指针 : 很好
this
在上面的代码 中是正确的
- 如果 delete-expression 的操作数的值不是空指针值,delete-expression 将
调用对象的析构函数(如果有的话) : 很好,析构函数什么都不做 ...
- 如果删除表达式的操作数的值不是空指针值,则:
如果未省略对要删除的对象的 new 表达式的分配调用,并且
分配未扩展(5.3.4),删除表达式应调用释放函数:好的,对象将被释放
由于代码不在object的allocated部分,而且在delete this
之后,代码只使用常量值true
,代码没有理由导致UB。常见问题解答(以及 refed 问题的答案)清楚地表明 delete this
是有效且惯用的 C++。
所以return true
没有理由不执行
话虽如此,对于 delete this
的任何其他用法,程序员必须确保仅在使用 new 分配的对象上使用它,否则它确实是 UB。
据我了解'delete this'使this指针指向的对象无效。
因此,使用任何成员变量都是未定义的;并且您不能调用虚拟(多态)函数(因为您不再有 vtable)。但是,您可以执行任何其他操作,包括(如您的情况)返回一个值。
假设我有一个 class 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 会 return 为真是未定义的行为?
我问的是“delete this;
”之后的成员函数发生了什么。
我在评论和常见问题解答中引用的 draft for current standard and also read the question 中进行了搜索。
我找不到任何说明此代码会导致未定义行为的元素。
标准说:
- delete操作数的值可能是空指针
值,指向由先前的 new 表达式创建的非数组对象的指针 : 很好
this
在上面的代码 中是正确的
- 如果 delete-expression 的操作数的值不是空指针值,delete-expression 将 调用对象的析构函数(如果有的话) : 很好,析构函数什么都不做 ...
- 如果删除表达式的操作数的值不是空指针值,则: 如果未省略对要删除的对象的 new 表达式的分配调用,并且 分配未扩展(5.3.4),删除表达式应调用释放函数:好的,对象将被释放
由于代码不在object的allocated部分,而且在delete this
之后,代码只使用常量值true
,代码没有理由导致UB。常见问题解答(以及 refed 问题的答案)清楚地表明 delete this
是有效且惯用的 C++。
所以return true
没有理由不执行
话虽如此,对于 delete this
的任何其他用法,程序员必须确保仅在使用 new 分配的对象上使用它,否则它确实是 UB。
据我了解'delete this'使this指针指向的对象无效。
因此,使用任何成员变量都是未定义的;并且您不能调用虚拟(多态)函数(因为您不再有 vtable)。但是,您可以执行任何其他操作,包括(如您的情况)返回一个值。