C 智慧型指標

2021-09-14 06:55:23 字數 1853 閱讀 8520

我們先來看一段**

#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, 這時智慧型指標正常

node1的_next指向node2, node2的_prev指向node1, 由於是在node物件中管理的, 所以此時引用計數變成2

node1和node2析構, 引用計數變為1, 但是node1中的_next和node2中的_prev還管理結點

node1要想完全釋放, 就必須釋放_next中的資源, 就是釋放node2

node2想要完全釋放, 就必須釋放_prev中的資源, 就是釋放node1

這就造成兩個結點迴圈引用, 而weak_ptr正是解決這類問題的

將listnode中的shared_ptr換成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 智慧型指標

記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...