c++中當我們需要新分配記憶體的時候需要手動的去呼叫new顯式的分配一塊記憶體,如果我們在任何中new(如函式中申請空間返回
忘記釋放,或者在
函式執行過程中出現異常,沒
有執行釋放語句)了空間,在不需要使用後忘記了呼叫delete這塊位址的話就會造成
記憶體洩露。
為了解決這乙個問題引入了智慧型指標。智慧型指標實際上是乙個指標的託管物件。它的建構函式是這樣宣告的:
template explict auto_ptr(x* p)
將外部分配的位址傳遞給它內部的乙個指標。
既然是物件,如果我們在函式中使用了智慧型指標,那麼返回的時候會呼叫它的析構
函式,析構函式實
現如下。
~auto_ptr() throw()
即使我們忘記了釋放,由於函式返回時候會依次呼叫各個物件的析構函式,他就幫我們完成了記憶體釋放。
舉乙個具體的例子:
#include #include #include using namespace std;
class ******
int main()
輸出結果如圖:
可以看到只有由智慧型指標管理的物件呼叫了其析構函式,而手動分配的如果沒有顯式的分配就造成了記憶體洩露。
那麼我們如果想提前手動釋放其
分配的記憶體應該怎麼辦呢?答案是呼叫它的reset()函式,實現如下
void reset(x* p=0)
在使用的過程中也可以使用release()函式來交出管理的記憶體物件,這點同其過載的『=』操作符有點類似,在經過這些操作以後智
能指標的內部位址
都會指向0,所以在對智慧型指標進行這些操作以後如果不是有十足的把握就不要再使用它了,它們的乙個實現如
下:
x* release()
template auto_ptr& operator=(auto_ptr& a)
智慧型指標的利用在執行建構函式的時候我們有時候對類初始化會進行諸如x * p=new x[5]的操作,意識到建構函式也可能會出問題後,以
下兩種寫法都是更好的選擇
這樣就可以保證在建構函式失敗的情況下不會造成記憶體洩露---因為系統棧在返回的時候都會依次呼叫其析構函式,將申請的內
存釋放掉。
記憶體的智慧型管理 智慧型指標
前言 我們在使用c和c 進行開發的時候,申請堆區記憶體是必不可少的,但是很多時候,我們經常忘記釋放他導致記憶體洩漏,從而導致程式崩潰,又或者在尚未使用完成的時候釋放,從而導致出現野指標,都是非常危險的現象,所以我們在c 11的標準中提出了智慧型指標的概念,他就是一種可以幫我們自動釋放記憶體的存在 共...
C 動態記憶體與智慧型指標
qq 1841545843 郵箱 jiaxx903 163.com 靜態記憶體用來儲存區域性 static 物件 類的 static 資料成員,以及定義在任何函式之外的變數。棧記憶體用來儲存定義在函式之內的 static 物件。除了棧記憶體和靜態記憶體外,每個程式還擁有乙個記憶體池,這部分稱之為 堆...
c 記憶體洩露與智慧型指標示例
最近在看cpp prime第六版,複習和補充一下基礎知識,有關c 記憶體洩露和智慧型指標的知識就不贅述了,這裡主要用乙個例子說明一下,先看乙個書中的圖,比較直觀 示例 include include double pd0 nullptr double pd1 nullptr void memory ...