侵入式智慧型指標

2021-06-27 18:42:45 字數 703 閱讀 9664

智慧型指標,就是利用物件的析構函式去執行資源釋放,很久之前寫的關於侵入式智慧型指標的筆記,今晚把它整理下。

資源共享型的智慧型指標有兩種實現,一種是侵入式,一種是非侵入式。在教材裡比較常見的是非侵入式的,它的實現完全放在智慧型指標模板裡,模板類有乙個用於儲存資源類物件的指標變數,和乙個用於記錄資源物件使用計數的指標變數,這兩個東西是所有的智慧型指標物件共享的,所以通過指標儲存。而侵入式則不同,它的實現分散在智慧型指標模板和使用智慧型指標模板的類中:模板類只有乙個用於儲存物件的指標變數,物件的計數放在了資源類中。

非侵入式智慧型指標,它的引用計數變數為了保證所有物件共享,需要用堆裡的記憶體,所以需要用new,這個都一樣,不一樣的是使用new的次數。侵入式智慧型指標的引用計數變數儲存在物件裡,因為物件是唯一的,所以引用計數也是唯一的,相比非侵入式智慧型指標,它的好處是:1、乙個資源物件無論被多少個侵入式智慧型指標包含,從始至終只有乙個引用計數變數,不需要在每乙個使用智慧型指標物件的地方都new乙個計數物件,這樣子效率比較高,使用記憶體也比較少,也比較安全;2、因為引用計數儲存在物件本身,所以在函式呼叫的時候可以直接傳遞資源物件位址,而不用擔心引用計數值丟失(非侵入式智慧型指標物件的拷貝,必須帶著智慧型指標模板,否則就會出現物件引用計數丟失)

。壞處是:1、資源類必須有引用計數變數,並且該變數的增減可以被侵入式智慧型指標模板基類操作,這顯得麻煩;2、如果該類並不想使用智慧型指標,它還是會帶著引用計數變數。

另外,智慧型指標有乙個無法避免的問題,就是迴圈引用。

智慧型指標 強弱智慧型指標

在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...

智慧型指標學習

最近接觸到智慧型指標很多,於是研究了一下智慧型指標的原理,寫下自己的心得體會,有不對的還請指正。智慧型指標產生的目的 因為在c 中,存在非常複雜的指標錯誤問題,例如,某個物件生成後,指向該物件的指標可能有多個,當我們用delete語句刪除其中的乙個指標後,物件就被銷毀,那麼其餘指向該物件的指標就會懸...

智慧型指標3

include include using namespace std define test smartptr class stub class sentry sentry private int lock template class refcountingtraits void unrefer...