shared_ptr 基本用法
shared_ptr**採用引用計數的方式管理所指向的物件**。當有乙個新的shared_ptr指向同乙個物件時(複製shared_ptr等),引用計數加1。當shared_ptr離開作用域時,引用計數減1。當引用計數為0時,釋放所管理的記憶體。
這樣做的好處在於解放了程式設計師手動釋放記憶體的壓力。之前,為了處理程式中的異常情況,往往需要將指標手動封裝到類中,通過析構函式來釋放動態分配的記憶體;現在這一過程就可以交給shared_ptr去做了。
一般我們使用make_shared來獲得shared_ptr。
cout
<<"test shared_ptr base usage:"
p1 = make_shared("");
if(p1 && p1->empty())
*p1 = "hello";
auto p2 = make_shared("world");
cout
<<*p1<<' '
<<*p2<<"test shared_ptr use_count:"
<<"p1 cnt:"
<"\tp2 cnt:"
cout
<<"p1 cnt:"
<"\tp2 cnt:"
<"\tp3 cnt:"
<<"p1 cnt:"
<"\tp2 cnt:"
<"\tp3 cnt:"
cout
<<"test shared_ptr and new:"
p4(new
int(1024));
//shared_ptrp5 = new int(1024); // wrong, no implicit constructor
cout
<<*p4《但是,不能將乙個new表示式返回的指標賦值給shared_ptr。
另外,特別需要注意的是,不要混用new和shared_ptr!
void process(shared_ptr
ptr)
cout
<<"test shared_ptr deleter:"
int(1024);
shared_ptr
p8(p7, print_at_delete);
p8 = make_shared(1025);
unique_ptr基本用法
unique_ptr對於所指向的物件,正如其名字所示,是獨佔的。所以,不可以對unique_ptr進行拷貝、賦值等操作,但是可以通過release函式在unique_ptr之間轉移控制權。
cout
<<"test unique_ptr base usage:"
up1(new
int(1024));
cout
<<"up1: "
<<*up1 up2(up1.release());
cout
<<"up2: "
<<*up2//up2 = up1; // wrong, unique_ptr can not copy
unique_ptr up4(new
int(1025));
up4.reset(up2.release());
cout
<<"up4: "
<<*up4<unique_ptr 作為引數和返回值
上述對於拷貝的限制,有兩個特殊情況,即unique_ptr可以作為函式的返回值和引數使用,這時雖然也有隱含的拷貝存在,但是並非不可行的。
unique_ptr clone(int p)
void process_unique_ptr(unique_ptr up)
{ cout
<<"process unique ptr: "
<<*up<<"test unique_ptr parameter and return value:"
cout
<<"up5: "
<<*up5unique_ptr同樣可以設定deleter,和shared_ptr不同的是,它需要在模板引數中指定deleter的型別。好在我們有decltype這個利器,不然寫起來好麻煩。
cout
<<"test unique_ptr deleter:"
int(1024);
unique_ptr up6(p9, print_at_delete);
unique_ptr up7(new
int(1025));
up6.reset(up7.release());
weak_ptr一般和shared_ptr配合使用。它可以指向shared_ptr所指向的物件,但是卻不增加物件的引用計數。這樣就有可能出現weak_ptr所指向的物件實際上已經被釋放了的情況。因此,weak_ptr有乙個lock函式,嘗試取回乙個指向物件的shared_ptr。
cout
<<"test weak_ptr basic usage:"
(1024);
weak_ptr wp1(p10);
cout
<<"p10 use_count: "
< int(1025)); // this will cause wp1.lock() return a false obj
shared_ptr
p11 = wp1.lock();
if(p11) cout
<<"wp1: "
<<*p11<<" use count: "
<
C 11新特性之智慧型指標
這一節將從用法上 記憶體儲存上以及生存週期上,對unique ptr,shared ptr和weak ptr做乙個深入剖析。unique ptr 不共享它的指標。它無法複製到其他 unique ptr,無法通過值傳遞到函式,也無法用於需要副本的任何標準模板庫 stl 演算法。只能移動 unique ...
c 11 新特性 智慧型指標使用詳解
c 11新增了新的智慧型指標,unique ptr shared ptr和weak ptr,同時也將auto ptr置為廢棄 deprecated 但是在實際的使用過程中,很多人都會有這樣的問題 不知道三種智慧型指標的具體使用場景 無腦只使用shared ptr 認為應該禁用raw pointer ...
C 11之智慧型指標
c 98提供了了智慧型指標auto ptr,但c 11已將其摒棄,並提供了unique ptr和shared ptr。這三種智慧型指標模板都定義了類似指標的物件,可以將new獲得的位址賦給這種物件。當智慧型指標過期時,這些記憶體將自動被釋放。其基本用法如下 include include inclu...