簡體   English   中英

刪除后返回值;

[英]Return value after delete this;

假設我有一個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; ”之后會員函數會發生什么。

我搜索的草案對現行標准,也讀出了問題的意見和常見問題解答引用。

我找不到任何元素說這段代碼應該導致Undefined Behavior。

標准說:

  • delete的操作數的值可以是空指針值,指向由前一個new-expression創建的非數組對象的指針 :fine this在上面的代碼中是正確的
  • 如果delete-expression的操作數的值不是空指針值,則delete-expression將為對象調用析構函數(如果有) :fine,析構函數不執行任何操作...
  • 如果delete-expression的操作數的值不是空指針值,則:如果沒有省略要刪除的對象的new-expression的分配調用,並且未擴展分配(5.3.4), delete-expression應調用deallocation函數 :fine,object將被釋放

由於代碼不在對象的已分配部分中,並且在delete this之后,代碼僅使用常量值true ,因此代碼沒有理由導致UB。 常見問題(和答案給裁判ED問題)清楚地表明, delete this是有效的,地道的C ++。

所以沒有理由不應該執行return true

話雖如此,對於delete this任何其他用法,程序員必須確保僅在分配有new的對象上使用它,因為如果不是它確實是UB。

據我所知,'刪除這個'使得this指針指向的對象無效。

因此,使用任何成員變量都是未定義的; 並且你不能調用虛擬(多態)函數(因為你不再有vtable)。 但是,您可以執行任何其他需要包含的內容(如在您的情況下)返回值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM