假设我有一个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?
我问在“删除这个;”之后会员函数会发生什么.
最佳答案 我在
draft搜索了当前的标准,并阅读了评论和FAQ中引用的
question.
我找不到任何元素说这段代码应该导致Undefined Behavior.
标准说:
> delete的操作数的值可以是空指针
value,指向前一个new-expression创建的非数组对象的指针:很好,这在上面的代码中是正确的
>如果delete-expression的操作数的值不是空指针值,则delete-expression将为
为对象调用析构函数(如果有的话):很好,析构函数什么都不做……
>如果delete-expression的操作数值不是空指针值,则:
如果没有省略对要删除的对象的new-expression的分配调用,则
分配没有扩展(5.3.4),delete-expression应该调用一个解除分配函数:罚款,对象将被解除分配
由于代码不在对象的已分配部分中,并且在删除之后,代码仅使用常量值true,因此代码没有理由导致UB. FAQ(和refed问题的答案)清楚地表明删除这是有效且惯用的C.
所以没有理由不应该执行return true.
话虽如此,对于删除的任何其他用法,程序员必须确保仅在分配有new的对象上使用它,因为如果不是它确实是UB.