C 的智慧型指標學習筆記 初

2022-07-25 11:30:20 字數 1759 閱讀 9851

c++ primer plus 16.2節介紹了auto_ptr,該模板類在c++11中已棄用,目前已被shared_ptr代替。

auto_ptr又叫做智慧型指標,用於管理動態記憶體分配的用法。

首先看乙個例子,

void remodel(string &str)
此例子有什麼缺陷呢?

函式結束的時候沒有釋放記憶體,這導致了記憶體的洩露,指標ps會被釋放,但是其指向的記憶體並沒有被釋放。一般來說,解決new導致的記憶體洩露的方法是在return之前使用delete.

但凡是涉及到「別忘了」的操作,都不是最佳的操作,因為一定會有開發者忘記,或者在不經意間刪除或者注釋掉了這些**。

就算是沒有忘記,也會因為一些別的操作導致記憶體無法釋放,例如以下的**:

void remodel(string &str)

str = *ps;

delete ps;

return;

}

在delete執行之前,如果執行過程中產生了異常並丟擲,則後續的指令都不會執行,這仍將導致記憶體洩露。

首先,我們知道,c++建立乙個物件有兩種方式,new和直接宣告。new乙個物件將在堆中動態分配記憶體來建立乙個物件,而直接宣告將會在棧記憶體中建立物件。

(所謂的堆,是指程式內部除了棧和靜態儲存區之外的"自由空間(free store)",堆記憶體用於在程式執行時分配物件。)

前者的生命週期是全域性的,後者則受到作用域限制,也就是說對於前者產生的物件,如果不去主動釋放它,則該物件所佔據的記憶體會一直存在,如果沒有指標可以指向它,則會導致記憶體洩露。

而直接宣告的物件,在乙個類物件過期的時候,析構函式會在乙個物件過期的時候自動執行從而將該物件釋放。

不妨這樣思考,如果指標能被封裝為乙個物件,則這個包含指標的物件過期的時候呼叫其析構函式,將該指標指向的物件delete,不就能夠把它指向的記憶體也釋放了嗎?

於是auto_ptr便誕生了,auto_ptr是乙個模板類,這樣便可以建立指向任何型別的智慧型指標。

templateclass auto_ptr;
throw()意味著建構函式不引發異常,因此請求t型別的auto_ptr將獲得乙個指向t型別的auto_ptr.

這樣便定義好了乙個智慧型指標,其實非常簡單,就是在構造的時候將普通的指標放入了auto_ptr模板類中

使用的時候

auto_ptrap(new double);//在建構函式中填入new出來的物件

*ap = 23.3;//ap物件的位址其實就是new出來的double物件的位址,所以可以用指標取值的方式賦值。

void remodel(string &str)
這裡,便不再需要使用delete了。

c++11摒棄了auto_ptr,主要是由於auto_ptr無法進行指標的傳遞。auto_ptr必須顯式地初始化,即auto_ptrps(new string("sdf")),

為了多個指標指向乙個new出的物件,c++11提出了shared_ptr,

shared_ptr中增加了引用計數,有n個指向乙個同乙個記憶體區域的shared_ptr時,它們共同維護乙個引用計數器。

shared_ptr的大概實現如下:

templateclass shared_ptr

~shared_ptr()

}};

當智慧型指標的析構函式啟用時,只有引用計數為0的時候,才會進行析構。

C 智慧型指標學習筆記

原文 摘錄智慧型指標 auto ptr,unique ptr,shared ptr,weak ptr 智慧型指標的作用是管理乙個指標,因為存在一下的情況 申請的空間再函式結束時忘記釋放,造成記憶體洩漏。使用智慧型指標可以很大程度上的避免這個問題,因為智慧型指標是乙個類,當超出了類的例項物件的作用域時...

C 學習筆記之智慧型指標

眾所周知,c 中最讓程式設計師頭疼的就是關於記憶體的問題,其中不外乎以下幾點 1.緩衝區溢位 2.野指標 3.重複釋放記憶體 4.不配對的new delete 5.記憶體洩露 其中大多數的問題都是對指標的不正確使用帶來的。為此c 標準庫中對原始指標做了一些封裝,比如auto ptr,使得指標更容易使...

C 智慧型指標weak ptr的學習筆記

weak ptr 智慧型指標是為了解決shared ptr相互引用導致的死鎖問題,它不控制物件的生命週期,不會增加物件的引用次數,和shared ptr可以相互轉化,是一種弱應用。下面的 就陷入了死鎖,p1和p2相互引用導致計數一直為1,而物件得不到銷毀。借助weak ptr指標 include i...