C 智慧型指標的使用

2021-09-26 14:25:42 字數 1496 閱讀 2124

c++11中提供了三種智慧型指標(unique_ptr、shared_ptr、weak_ptr)來自動**堆分配的物件。

unique_ptr如它的名字所傳達的意思,其所指向的記憶體區不能與unique_ptr定義的另乙個指標共享。看**比較容易理解。

#include

#include

using namespce std;

intmain()

p1為unique_ptr型別指標,其不能與p2共享同一片記憶體區域。

當然也可以用標準庫的move函式顯式的將「所有權」轉移給另乙個unique_ptr指標,但原來的指標名將不能再使用。

#include

#include

using namespace std;

intmain

(int argc,

char

** ar**)

可以看到「所有權」已經被轉移走的p1已經不能用*來獲取儲存值了。另外需要注意的一點是,unique_ptr定義的指標可以不用自己來釋放記憶體。但也可以自己顯式地用reset釋放記憶體,而且多次釋放也不會報錯。

shared_ptr相對於unique_ptr來說最主要的區別是它可以共享指標,可以多個指標變數指向一片共同的儲存區。

#include

#include

using namespace std;

intmain

(int argc,

char

** ar**)

可以看到上面雖然用reset顯式地釋放了sp1指向的記憶體。但實際上並沒有真正釋放其指向的記憶體。因為sp2依然可以正常訪問。可以想象,共享指標內部實現了乙個計數,只有指向該記憶體空間的所有共享指標都進行了釋放操作,該記憶體才真正釋放。這避免了普通指標進行多次釋放引發的錯誤。

weak_ptr可以指向shared_ptr指標指向的物件記憶體,但並不擁有該記憶體。使用weak_ptr的lock成員函式可返回其指向記憶體的乙個shared_ptr物件,且在所指物件已經無效時,返回指標空值(nullptr)。這在驗證share_ptr智慧型指標的有效性上會很有作用。

#include

#include

using namespace std;

void

check

(weak_ptr<

int>

& wp)

else

}int

main

(int argc,

char

** ar**)

當對sp1和sp2都呼叫了reset函式。這樣導致對唯一的堆記憶體物件的引用計數降至0。一旦引用計數變成0後,shared_ptr就會釋放堆記憶體空間,指標就會失效。此時再呼叫weak_ptr的lock函式時就會返回乙個指標空值nullptr。而check函式則會列印pointer is invalid.

C 智慧型指標使用

由於 c 語言沒有自動記憶體 機制,程式設計師每次 new 出來的記憶體都要手動 delete。程式設計師忘記 delete,流程太複雜,最終導致沒有 delete,異常導致程式過早退出,沒有執行 delete 的情況並不罕見。std auto ptr boost scoped ptr boost ...

C 智慧型指標的使用

測試環境 win7,vs2012 如果未安裝boost,請參考 涉及智慧型指標 shared ptr,weak ptr,scoped ptr,auto ptr 其它 enable shared from this 總呼叫函式 testsmartpointer 可以將其放在main 中執行。解釋在 中...

c 基礎 使用智慧型指標

三個智慧型指標模板 auto ptr unique ptr和shard ptr 都定義了類似指標的物件 c 11已將auto ptr摒棄 可以將new獲得 直接或間接 的位址賦給這種物件。當智慧型指標過期時,其析構函式將使用delete來釋放記憶體。因此,如果將new返回的位址賦給 這些物件,將無需...