簡體   English   中英

在析構函數中“刪除”

[英]“delete this” in destructor

如果程序的每個實例都使用new動態分配了 memory,那么最好在析構函數中釋放它們。

#include <iostream>

using namespace std;


class c{


    public:

        c(){cout << "Created Object";}


    ~c(){
        delete this;
        cout << "Deleted object";
    }

};



int main(){


    c* ptr = new (nothrow) c();

    if(ptr == NULL){
        cout << "Null pointer" << endl;
        return 1;
    }

    delete ptr;
}

delete this根本不允許嗎? this指向 memory 中的一個位置,該位置已使用new分配,那么為什么會導致segmentation fault 我知道,代碼對於存儲在堆棧中的對象不是通用的,但我想弄清楚是否有辦法實現這個概念。

delete不是free的。 讓我在delete上引用cppreference

delete表達式

如果expression不是 null 指針...,則 delete 表達式為正在銷毀的 object 調用析構函數(如果有)。

之后,無論任何析構函數是否引發異常,刪除表達式都會調用釋放 function:任一operator delete (對於表達式的第一個版本)...

所以, delete this; ~c()內部將調用~c()並且您最終會得到無限遞歸。 一般來說, delete this; 如果您知道自己在做什么, 則允許

刪除這個根本不允許?

它很少有用,但它是允許的。

它永遠不會有用的一種情況是析構函數。 Delete 調用析構函數。 如果你在調用析構函數的析構函數調用析構函數調用析構函數調用析構函數調用析構函數調用析構函數...有一個問題。

delete ptr; 刪除 object。 在析構函數中, delete this; 再次刪除它。 僅此一項就是一場災難,但正如另一個答案所提到的,這會導致析構函數被第二次調用,所以delete this; 第三次刪除 object,這會調用析構函數,無限期(或直到堆棧溢出,以先到者為准)。

暫無
暫無

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

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