簡體   English   中英

析構函數未被調用

[英]Destructor not being called

根據: http : //www.cplusplus.com/doc/tutorial/classes/

析構函數實現與構造函數相反的功能。 在銷毀對象時會自動調用該對象,這是因為其存在范圍已完成(例如,如果已將其定義為函數中的本地對象並且函數結束),或者因為它是動態分配的對象並已釋放使用運算符刪除。

示例代碼:

    class Something
    {
    public:
        Something() {cout << "construction called" << endl; }
        ~Something()    { cout << "destruction called" << endl; }
    };


    void foo(){
        Something *ob = new Something();
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
        foo();
    }

沒錯,但是您可以在動態內存中分配對象,這意味着只有調用delete ,它才會被破壞。

因為它是動態分配的對象,並且使用運算符delete釋放。

您永遠不會調用刪除。 Ergo內存泄漏和未調用的析構函數:

void foo(){
    Something *ob = new Something();
    delete ob;
}

或者,或者只是在自動內存中分配對象:

void foo(){
    Something ob;
}

或將內存管理委托給智能指針。

在銷毀對象之前調用析構函數。 由於為對象分配了new ,因此必須通過在指向對象的指針上調用delete來手動顯式銷毀它並釋放所占用的內存。

如果您已在自動存儲中創建對象,請

Something ob;

foo返回時,對象超出范圍將自動銷毀對象,並調用析構函數。

暫無
暫無

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

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