條款13 以物件管理資源

2022-01-22 09:33:28 字數 727 閱讀 6903

首先考慮乙個工廠函式

investment *createinvestment();

void

f()

至少上面這個函式是不安全的,例如如果...裡面包含return語句的話,

或者說...裡面包含可能會丟擲異常的語句。那麼就會導致申請的記憶體得不到釋放。

而下面就說明了管理物件的一般方法:

void

f()

用物件來進行管理,這樣在離開作用域的時候申請的記憶體便會自動得到釋放。

注意這裡包含有兩個關鍵的想法:

1. 獲得資源之後應該把他們立刻放到管理物件裡面。

2. 管理物件可以利用析構函式使得資源正確的被釋放。

注意,shared_ptr等智慧型指標不能對內建的陣列進行管理,因為他們在自己的析構函式裡面呼叫的是

delete而不是delete, 例如下面這樣就是不可取的:

shared_ptr

spi(new

int[1024]); //

不要這樣做

這種情況應該使用vector來代替:

shared_ptr

spi(new vector); //

像這樣

小結:1. 為防止資源洩露,應該使用raii物件,他們在建構函式中獲得資源,而在析構函式裡面釋放資源。

2. auto_ptr不能用在多個指標指向同乙個物件的場合。

條款13 以物件管理資源

問題 解決 智慧型指標。把資源放入物件內,利用析構函式確保釋放。1 資源取得時機便是初始化時機 resource acquisition is initialization raii 2 管理物件運用析構函式確保資源被釋放。別讓auto ptr同時指向同一物件。為了預防這個問題,能過copy建構函式...

條款13 以物件管理資源

我們都知道,當new乙個東西之後,必須delete它。但是問題可能出現在在new和delete之間 比如中間出現了異常,或者return之類的。一種比較好的作法是通過物件來管理 因為當物件的宣告週期結束以後,會呼叫析構函式,而在析構函式中delete,這樣的作法就靠譜多了。在標準c 中,定義了2種管...

條款13 以物件管理資源

一 如下 假設各種子型別繼承 root class investmen class investment investment createinevstment factory函式 void f 在 區域內乙個過早return,或者期間丟擲異常,流程控制不可能經過這條語句,所以這樣的話就會導致資源洩...