删除后返回值;

时间:2015-01-02 21:28:02

标签: c++ return-value member-functions delete-operator

假设我有一个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;”之后会员函数会发生什么。

2 个答案:

答案 0 :(得分:1)

我在draft中搜索了当前标准,并阅读了评论和常见问题解答中引用的question

我找不到任何说明此代码会导致未定义行为的元素。

标准说:

  • delete的操作数的值可以是空指针 value,指向前一个新表达式创建的非数组对象的指针:fine this在上面的代码中是正确的
  • 如果delete-expression的操作数值不是空指针值,则delete-expression将 为对象调用析构函数(如果有的话):很好,析构函数什么都不做......
  • 如果delete-expression的操作数值不是空指针值,则: 如果没有省略对要删除的对象的new-expression的分配调用,则 分配没有扩展(5.3.4),delete-expression应该调用一个解除分配函数:罚款,对象将被解除分配

由于代码不在对象的已分配部分中,并且在delete this之后,代码仅使用常量值true,因此代码没有理由通向UB。常见问题解答(以及ref ed 问题的答案)清楚地表明delete this是有效且惯用的C ++。

因此没有理由不执行return true

话虽如此,对于delete this程序员的任何其他用法,必须确保仅在分配有new的对象上使用它,因为如果不是它确实是UB。

答案 1 :(得分:1)

据我所知'删除这个'会使this指针指向的对象无效。

因此,使用任何成员变量都是未定义的;并且你不能调用虚拟(多态)函数(因为你不再有vtable)。但是,您可以执行其他任何需要包含的内容(如在您的情况下)返回值。