智慧型指標和異常

2021-06-30 16:49:41 字數 811 閱讀 4712

使用異常處理的程式能在異常發生後令程式流程繼續,同時要注意的是,這種程式需要確保在異常發生後資源能被正確地釋放。乙個簡單的確保資源被釋放的方法是使用智慧型指標。

如果使用智慧型指標,即使程式塊過早結束,智慧型指標類也能確保在記憶體不再需要時將其釋放:

void func()

// 在函式結束時shared_ptr自動釋放記憶體

函式的退出有兩種可能,正常結束或發生了異常,無論哪種情況,區域性物件都會被銷毀。在上面的程式中,sp是乙個shared_ptr,因此sp銷毀時會檢查引用計數。在此例中,sp是指向這塊記憶體的唯一指標,因此記憶體會被釋放掉。

與之相對的,當發生異常時,直接管理的記憶體是不會自動釋放的。如果使用內建指標管理記憶體,且在new之後在對應的delete之前發生了異常,則記憶體不會被釋放:

void func()

{ // 動態分配乙個新物件

int* ip = new

int(12);

// 這段**丟擲乙個異常,且在func中異常未**獲

delete ip; // 在退出之前釋放記憶體

如果在new和delete之間發生異常,且異常未在func中**獲,則記憶體就永遠不會被釋放了。在函式func之外沒有指標指向這塊記憶體,因此就無法釋放它了。

標準庫類在內的很多c++類都定義了析構函式,負責清理物件使用的資源。但是,不是所有的類都是這樣良好定義的。

那些分配了資源,而又沒有定義析構函式來釋放這些資源的類,可能會遇到與使用動態記憶體相同的錯誤。類似的,如果在資源分配和釋放之間發生了異常,程式也會發生資源洩漏。

智慧型指標和異常

今天讓我們來分析一下c 中的智慧型指標和異常,首先呢先普及一下概念!1 智慧型指標 智慧型或者自動化的管理指標所會向的動態資源的釋放。2 異常 當乙個函式發現自己無法處理的錯誤時,讓函式的呼叫者直接或間接的處理這個問題。3 raii 資源分配即初始化。建構函式完成物件的初始化,析構函式完成物件的清理...

C 異常 與智慧型指標

void func1 上面是個很露骨的 異常不安全 的例子。一旦發生異常,p申請的記憶體將得不到釋放。乙個簡單的辦法是 int p new int 1024 trycatch delete p 還有種方法是定義乙個簡單的類ptr,它含有乙個指標成員。該類的析構函式會釋放這個指標所指物件的記憶體。vo...

智慧型指標和萬能指標

智慧型指標 智慧型指標 smart pointer 是儲存指向動態分配 堆 物件指標的類。除了能夠在適當的時間自動刪除指向的物件外,他們的工作機制很像c 的內建指標。智慧型指標在面對異常的時候格外有用,因為他們能夠確保正確的銷毀動態分配的物件。他們也可以用於跟蹤被多使用者共享的動態分配物件。智慧型指...