C 智慧型指標

2021-07-05 00:03:19 字數 1273 閱讀 3328

最近樓主在深入學習c++,發現智慧型指標和控制代碼類挺有意思的,而且也有點難度,所以就寫下來,日後可以回顧.

這篇博文先介紹智慧型指標,下篇介紹控制代碼類.

#include class hasptr

hasptr(const hasptr& hptr):ptr(hptr.ptr){}

hasptr& operator=(const hasptr& hptr)

~hasptr()

void print()

這個函式輸出如下:

接下來,我new乙個hasptr,複製ptr,然後把這個新生產的hasptr給delete掉,則輸出發生了變化,**如下:

#include "hasptr.h"

#include int main(void)

輸出為:

問題來了,為什麼ptr的輸出值為0了?

原來這是因為new_ptr在複製ptr時,只是簡單的指標值賦值,也就是說這兩個物件的ptr指向的是堆中的同乙個變數,

當new_ptr銷毀時,把ptr的指標指向的成員都銷毀了,這樣的輸出是沒定義的,因為ptr的指標指向的時一塊無效的記憶體.有沒解決的辦法了?有,這時智慧型指標的就派上用場了.

智慧型指標主要思想就是新增乙個計數成員變數(<<c++ primer>>用的時技術類,思想一樣),當進行類複製或賦值時,這時類計數成員變數要加1,表示有多少個類引用指標變數,當銷毀乙個類時,要判斷計數成員是否為0,如果為0,則表示沒有物件引用該指標指向的記憶體,可以delete,如果不為0,則析構函式啥都不做.**如下:

#include class hasptr

hasptr(const hasptr& hptr):ptr(hptr.ptr),use(hptr.use)

hasptr& operator=(const hasptr& hptr)

~hasptr()

void print()

{ std::cout<

這樣改變之後,輸出的結果就還是42,而不是0.

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 智慧型指標

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