C 11智慧型指標Shared ptr陷阱

2021-07-25 06:24:30 字數 2524 閱讀 9784

1.不要把乙個原生指標給多個shared_ptr管理

int* ptr = new

int;

shared_ptr

p1(ptr);

shared_ptr

p2(ptr); //logic error

//ptr物件被刪除了2次

2.不要把this指標給shared_ptr

class test

private:

shared_ptr

m__sp;

};test* t = new test;

shared_ptr

sp(t);

sp->getself();

//sp物件被刪除了2次

3.shared_ptr作為被保護的物件的成員時,小心因迴圈引用造成無法釋放資源。(解決辦法,可使用weak_ptr)

weak-ptr協助shared_ptr共同協助作用。

4.不要在函式實參裡建立shared_ptr

function ( shared_ptr

(new

int), g( ) );

//有缺陷可能的過程是先new int,然後調g(),g()發生異常,shared_ptr沒有建立,int記憶體洩露。

//boost推薦寫法

shared_ptr

p(new

int());

f(p, g());

5.物件內部生成shared_ptr

class

y: public

boost::enable_shared_from_this

>

};//

boost文件說,在呼叫shared_from_this()之前,必須存在乙個正常途徑建立的shared_ptr

boost:

:shared_ptr spy(new y)

boost:

:shared_ptr p = spy->getself(); //

ok

6.物件陣列用shared_array

int* pint = new

int[100];

shared_array p (pint );

//既然shared_ptr對應著delete;顯然需要乙個delete對應物shared_array

7.weak_ptr在使用前需要檢查合法性。

weak_ptrwp;

shared_ptr

sp_null = wp.lock(); //sp_null .use_count()==0;

/*因為上述**中sp和sp_ok離開了作用域,其容納的k物件已經被釋放了。得到了乙個容納null指標的sp_null物件。在使用wp前需要呼叫wp.expired()函式判斷一下。因為wp還仍舊存在,雖然引用計數等於0,仍有某處「全域性」性的儲存塊儲存著這個計數資訊。直到最後乙個weak_ptr物件被析構,這塊「堆」儲存塊才能被**。否則weak_ptr無法直到自己所容納的那個指標資源的當前狀態。*/

8.不要new shared_ptr

本來shared_ptr就是為了管理指標資源的,不要又引入乙個需要管理的指標資源shared_ptr*

9.盡量不要get

class b;

class d : public b; //繼承層次關係

shared_ptrsp (new d); //通過隱式轉換,儲存d的指標。

b* b = sp.get(); //shared_ptr辛辛苦苦隱藏的原生指標就這麼被刨出來了。

d* d = dynamic_cast

(b); //這是使用get的正當理由嗎?

//正確的做法

shared_ptrspb (new d) ;

shared_ptr

spd = shared_dynamic_cast(spb); //變成子類的指標

//shared_ptr在竭盡全力表演的像乙個原生指標,原生指標能幹的事,它也基本上能幹。

//另乙個同get相關的錯誤

shared_ptr

sp(new t);

shared_ptr

sp2( sp.get() ) ;//又乙個「二龍治水」例項,指標會刪2次而錯誤。

10.建構函式裡呼叫shared_from_this拋例外

class holder:public enable_shared_from_this

};//同前面條款5,不符合enable_shared_from_this使用前提。

只為記錄,只為分享! 願所寫能對你有所幫助。good good study, day day up!

C 11智慧型指標

本文介紹c 的四種智慧型指標,其中後三種是c 11新增加的,auto ptr已被棄用。要編譯c 11,需要安裝g 4.8 sudo add apt repository ppa ubuntu toolchain r test sudo apt get update sudo apt get inst...

c 11 智慧型指標

如果在程式中使用new從堆 自由儲存區 分配記憶體,等到不需要時,應使用delete將其釋放。c 引入了智慧型指標auto ptr,以幫助自動完成這個過程。c 11摒棄了auto ptr,並新增了三種智慧型指標 unique ptr,shared ptr,weak ptr。一.auto ptr,un...

c 11 智慧型指標

首先來看shared ptr,先貼一小部分vs2013裡的實現 template class shared ptr template class shared ptr public ptr base ty template explicit shared ptr ux px template cla...