智慧型指標(shared ptr的實現)

2021-09-07 04:07:51 字數 2035 閱讀 2391

1.實現原理:shared_ptr是利用乙個計數器,無論我們使用拷貝建構函式、賦值運算子過載、作為函式返回值、或作為引數傳給乙個引數時計數器+1,

當shared_ptr被賦予乙個新值或者需要銷毀時,計數器–,直到計數器為0時,呼叫析構函式,釋放物件,並銷毀其記憶體。shaerd_ptr不直接支援管理動態陣列,如果希望使用shared_ptr管理乙個動態陣列,必須定製自己的刪除器。

class sharedptr

sharedptr(const sharedptr&s)

:_ptr(s._ptr)

, _pcount(s._pcount)

sharedptr&operator=(const sharedptr&s)

_ptr = s._ptr;

_pcount = s._pcount;

*(_pcount)++;

}return *this;

}t&operator*()

t*operator->()

~sharedptr()

}private:

t*_ptr;

int *_pcount;//指向引用計數的指標

};int main()

2.但是其存在一些問題:

問題一:迴圈引用問題:

templatestruct listnode

~listnode()

t _value;

shared_ptr> _prev;

shared_ptr> _next;

};void test()

int main()

當資源要釋放時,p1節點釋放的前提是p2釋放,而p2的釋放又依賴於p1,就形成了乙個互相等待的局面,上公升到作業系統的話,就等於程序之間形成了死鎖,只不過這裡是資源釋放的依賴關係,而作業系統是資源競爭的關係。最終程式形成了迴圈引用,兩個節點都無法釋放資源,記憶體洩漏也就順理成章。

問題一:迴圈引用問題

解決辦法:所以此時需要利用weak_ptr來解決迴圈引用的問題,weak_ptr它指向的是乙個由shared_ptr管理的物件,將乙個weak_ptr繫結到乙個shared_ptr的物件上,其不會改變shared_ptr的引用計數,一旦最後乙個指向物件的shared_ptr被銷毀,物件就會被銷毀,即使有weak_ptr指向物件,物件還是被釋放。

templatestruct listnode

~listnode()

t _value;

weak_ptr> _prev;

weak_ptr> _next;

};void test()

int main()

weak_ptr是乙個不控制物件生命週期的智慧型指標,它指向乙個由shared_ptr指向的物件,將乙個weak_ptr繫結到由shared_ptr指向的物件上,它不會改變shared_ptr的引用計數,當引用計數等於0時,

物件就會被銷毀,呼叫析構函式,即使weak_ptr指向物件,物件還是會釋放。

問題二:執行緒安全問題

shared_ptr物件提供與內建型別一致的執行緒安全級別,乙個shared_ptr指向的物件可以被多個執行緒進行「讀」,乙個shared_ptr指向的物件可以被多個執行緒寫入,雖然這些看似是拷貝,但是導致執行緒不安全。(即使這些實 例是拷貝,而且共享下層的引用計數),任何其它的同時訪問的結果會導致未定義行為。總結一下主要有3個方面。

1.同乙個shared_ptr被多個執行緒「讀「是安全的。

2.同乙個shared_ptr被多個執行緒「寫」是不安全的。

3.共享引用計數不同的shared_ptr被多個執行緒「寫」是安全的。

問題三:記憶體洩漏問題

當我們用malloc申請出來的空間是無法釋放的,因為malloc申請的空間只能用free來釋放,而當我們開啟乙個檔案指標,程式執行完畢後,需要關閉檔案,否則會造成記憶體洩漏。

所以要來定製刪除器,定製刪除器還有乙個原因是shared_ptr不支援動態陣列管理,若要管理動態陣列,則需自己定製刪除器。

shared ptr智慧型指標

智慧型指標是乙個行為類似指標的物件。我們在使用堆記憶體時,都需要及時地進行釋放,避免造成記憶體洩漏。但我們偶爾也會忘記將其釋放掉,從而造成記憶體洩漏。並且,在釋放的時候,我們可能對某乙個指標進行了重複釋放,導致程式崩潰的問題。為了能夠解決這些問題,從而有了智慧型指標的設計。智慧型指標一共有四種,分別...

shared ptr(智慧型指標)

只要將 new 運算子返回的指標 p 交給乙個 shared ptr 物件 託管 就不必擔心在 寫delete p語句 實際上根本不需要編寫這條語句,託管 p 的 shared ptr 物件在消亡時會自動執行delete p。而且,該 shared ptr 物件能像指標 p 樣使用,即假設託管 p ...

智慧型指標shared ptr

shared ptr在脫離自己的作用域時候,會自動呼叫析構函式。作用域包含 塊 被呼叫函式 main函式等。include include include include using namespace std class a a int n private int n string str voi...