weak_ptr的一點認識
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
近期在補充和梳理C++方面的知識的時候,遇到了WeakPtr這個概念和用法,不甚明白,Google出了一堆文字,包括Boost的shared_ptr和weak_ptr的比較,以及其他一些博客里面給的例子以及解釋。
其中有一個是這樣解釋的,原文大意:在C++的weak_ptr里面,有兩類指針,一類是擁有對象的生命周期;另一類不擁有,只有訪問權。
在這里,我就有點不明白,這兩類指針,到底會在編寫上面,或者形式上面,有什么區別呢?
或者說weak_ptr到底要解決編程當中的什么問題呢? 為什么會有這個類型被提出?
經過和一位朋友的討論,有了答案。
比如現在有兩個函數
class A;
void Func1(A* a);
void Func2(A* a);
A* a = new A;
Func1(a);
Func2(a);
他們在同一個作用域的時候,a 被釋放后,慣有的操作是 a = NULL這個時候Func2 或者 Func1中都可以判斷到這個變化。
但是如果Func1在另外一個線程/進程里面,你在傳遞過來的時候a并不是空的a,但是指向的對象,已經被釋放了,這個指針已經不在有權限去訪問了。那么就會出現問題。
所以weak_ptr就出現了,讓你在使用資源之前,先去問下HasWeakPtr() 如果有,那么表明這個資源還沒有被釋放,可以放心去用,否則就應該不能再使用了。
以往的代碼,寫法: if (a) {}
但是*a 已經被釋放之后,其實a并沒有在上下文被a = NULL 所以a 還是指向那個地址,但是地址指向的內容已經非法了。
一點點小認識,希望對于大家對weak_ptr的理解有所幫助。
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成