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)。但是,您可以执行任何其他操作,包括(如您的情况)返回一个值。