我們先來看一段**
#include
#include
intmain()
當我們執行程式就會有段錯誤, 這是因為auto_ptr
實現的原理跟簡單: 實際上就是管理許可權的轉移, 就如上面的**, 使用copy物件來管理記憶體, 之前的ap物件就直接懸空, 對其解引用就會有錯誤
我們可以模擬實現auto_ptr
來了解其實現原理
template
<
class
t>
class
auto_ptr
auto_ptr
(const auto_ptr
& ap)
:_ptr
(ap._ptr)
auto_ptr
&operator
=(auto_ptr
& ap)
_ptr = ap._ptr;
ap._ptr =
nullptr;}
return
*this;}
t&operator*(
) t*operator
->()
~auto_ptr()}};
auto_ptr雖然可以滿足智慧型的要求. 但是不滿足對指標的要求, 要知道乙個指標是可以被賦值的, 這樣兩個指標都指向同一塊記憶體空間, 但是auto_ptr明顯不滿足這個要求, 所以他的使用也不是非常廣泛這裡實現乙份簡單的shared_ptr來理解其原理
迴圈引用分析:
node1和node2指向兩個結點, 引用計數變成1, 這時智慧型指標正常將listnode中的shared_ptr換成weak_ptr就可以解決這類問題node1的_next指向node2, node2的_prev指向node1, 由於是在node物件中管理的, 所以此時引用計數變成2
node1和node2析構, 引用計數變為1, 但是node1中的_next和node2中的_prev還管理結點
node1要想完全釋放, 就必須釋放_next中的資源, 就是釋放node2
node2想要完全釋放, 就必須釋放_prev中的資源, 就是釋放node1
這就造成兩個結點迴圈引用, 而
weak_ptr
正是解決這類問題的
c 智慧型指標
auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...
c 智慧型指標
很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...
c 智慧型指標
記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...