2

下面程序的輸出是:RAII失敗 - 爲什麼這個C++代碼泄漏? - 投構造函數在try塊防止析構函數

開始嘗試
對象()構造函數
開始抓

爲什麼Holder類的析構函數不叫?這是內存泄漏嗎?是否可以在不重新拋出的情況下調用Holder類的析構函數?

#include <iostream> 
#include <exception> 


class Object 
{ 
public: 
    Object() { std::cout << "Object() ctor" << std::endl; } 
    ~Object() { std::cout << "~Object() dtor" << std::endl; } 
}; 

class Holder 
{ 

public: 
    Holder() :myObjectP(new Object()) 
    { 
     throw std::exception(); 
    } 
    ~Holder() 
    { 
     std::cout << "~Holder()" << std::endl; 
     delete myObjectP; 
    } 
private: 
    Object* myObjectP; 

}; 

int main(int argc, char* argv[]) 
{ 
    try 
    { 
     std::cout << "begin try" << std::endl; 
     Holder h; 
    } 
    catch (...) 
    { 
     std::cout << "begin catch" << std::endl; 
    } 
    return 0; 
} 
+1

你可能想看看[這裏](https://isocpp.org/wiki/faq/exceptions#selfcleaning-members),不知是不是啓發 – Nacho

+1

有可能包住整個構造的一個嘗試/ catch塊,包括初始化列表,但我從來沒有做過,也不記得語法。 –

回答

2

在這種情況下,您的Holder對象h沒有完全constructued,那就是棧展開過程已經開始之前h的構造尚未完成構建。

C++ 11個15.2構造和析構 (2)

任何存儲持續時間,其初始化或破壞 由一個異常終止將具有用於其完全構造子對象所有 執行析構函數的一個目的(不含 工會狀類的變體的成員),即,用於子對象的量,主要 構造(12.6.2)已經完成執行和析構函數具有 尚未開始執行。

+2

是的,有內存泄漏。除非你的意思是在即將結束的計劃中。但就持有人類而言,肯定有一個。 –

+2

很確定你自己的答案說會有內存泄漏。 – Barry

相關問題