M10 在構造方法內阻止資源洩漏

2021-09-08 20:33:50 字數 800 閱讀 7124

1、類中沒有指標,如果物件構造過程**現異常,c++保證已經構造好的那一部分自動銷毀。注意:這裡不是呼叫析構方法,而是編譯器在你的構造方法中插入了一些**,保證對已經構造好的物件析構。

2、類中有指標,比如有a, b兩個指標。物件構造時,a初始化完成,b丟擲異常,c++只會對已經構造好的物件析構,而不會對已經初始化好的指標執行delete。因此資源洩漏。

3、注意,這種情況下,絕不會呼叫析構方法,因為c++只會析構已經構造完成的物件。接著思考,在堆上分配物件,把指標傳出來,對指標delete,可行嗎?

不可行,因為構造過程出現異常,指標是傳遞不出來的。外部的指標還是null。

4、思考:為什麼c++只析構已經構造完成的物件?

假如析構部分構造的物件,那麼析構方法該做些什麼事呢?應該是析構已經構造好的那一部分,但是這要求記錄哪些內容已經構造好,哪些內容沒有構造好,顯然,這個代價太大,因此不執行。

5、怎麼解決上面的問題呢?

對指標的初始化過程,使用try...catch。但是這裡有個問題,對於const指標(不是指向const物件的指標),必須在初始化列表中進行初始化,沒辦法使用try...catch。該怎麼辦? 建立成員方法,返回指標。

6、第一條我們就提到,物件構造過程中,如果出現異常,c++會對已經構造好的物件進行析構,但是不會對已經初始化好的指標進行delete。c++如何做到這一點,編譯器在構造方法中插入了一些**。因此,更好的解決辦法是:不使用原始指標,而是使用智慧型指標,智慧型指標本質上就是:棧上的物件來管理資源。在這種情況下,類中沒有原始指標,只有智慧型指標,物件構造過程出現異常,c++對已經構造好的物件進行析構,包括智慧型指標,進而釋放資源。

OC語言10 構造方法

完整的建立乙個可用的物件 person p person new new方法的內部會分別呼叫兩個方法來完成2件事情,1 使用alloc方法來分配儲存空間 返回分配的物件 2 使用init方法來對物件進行初始化。可以把new方法拆開如下 1.呼叫類方法 alloc分配儲存空間,返回未經初始化的物件 p...

M25 將構造方法和非成員方法虛化

1 所謂虛化,就是根據引用或者指標的真實型別,決定呼叫哪個方法。2 構造方法虛化,就是根據引用 或者指標 的真實型別,構造出乙個物件,如果指標的真實型別是base,返回base 如果指標的真實型別是derived,返回derived 解決辦法是 base定義乙個virtual方法clone,呼叫ne...

在TP中M方法與D方法的區別

雖然都是例項化模型物件,兩者還是有區別的 d和m的區別主要在於 m方法不需要建立模型類檔案,m方法不會讀取模型類,所以預設情況下自動驗證是無效的,但是可以通過動態賦值的方式實現 而d方法必須有建立模型類。我們可以用下面兩種方法去建立乙個資料表的對映物件 第一種 test d test 第二種 tes...