c – 删除后返回值;

假设我有一个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.

点赞