c 引用計數實現簡單智慧型指標

2021-09-25 21:43:58 字數 3668 閱讀 6223

使用智慧型指標類+輔助類+原始指標實現:

輔助類:儲存引用計數和原始指標, 智慧型指標型別為友元 ;

將原來儲存在智慧型指標中的內部結構體移出來形成單獨類,智慧型指標內部不用儲存這個類的指標,通過友元來訪問這個類中成員。

智慧型指標:初始化,析構,拷貝賦值,複製函式,過載*,過載->

通過智慧型指標的成員函式來操作輔助類中的引用計數和原始型別的拷貝。

class baseclass ;~

baseclass()

;};

smartpoint.h

#

ifndef

smartpoint_baseclass_h

#define

smartpoit_baseclass_h

#include

class u_ptr;

using std::cout;

using std::endl;

// 基本型別

class baseclass ;~

baseclass()

;};// 輔助類

class u_ptr

;// 智慧型指標接收的原始指標用來賦值給輔助類,同時賦值類中的引用計數賦初值為1

~u_ptr()

;// 析構刪除原始指標指向的內容

int count;

// 引用計數器

baseclass *baseclass_;

// 基本型別};

// 要實現的智慧型指標

class smartptr

;// 智慧型指標接收原始指標,將原始指標賦值給輔助類,並初始化輔助類

smartptr

(const smartptr &rsp)

:ptr

(rsp.ptr)

smartptr &operator=

(const smartptr &rsp)if(

--ptr->count ==0)

cout <<

"原物件引用計數減1"

<< endl;

ptr = rsp.ptr;

++ptr->count;

cout <<

"新物件引用計數為"

<< ptr->count << endl;

return

*this;

}// 過載運算子*, 使得智慧型指標可以和原始指標一樣使用*運算子

baseclass &operator*()

// 過載運算子(), 使得智慧型指標可以和原始指標一樣可以使用->運算子

baseclass *operator->()

~smartptr()

cout <<

"~smartptr(): 原物件引用計數減少1, 還剩下引用計數次數:"

<< ptr->count << endl;

}private:

u_ptr *ptr;

// 智慧型指標內含的計數輔助類(儲存計數器和原始指標)};

#endif

//smartpoint_baseclass_h

main.cpp

#

include

#include

"baseclass.h"

intmain()

輸出內容:

hello, world!

初始化引用計數,引用計數為:1

引用計數增加為2

原物件引用計數減1

新物件引用計數為2

~smartptr()

: 原物件引用計數減少1

, 還剩下引用計數次數:1

~smartptr()

: 原物件引用計數減少為0

, 釋放記憶體

析構原始指標

~smartptr()

: 原物件引用計數減少1

, 還剩下引用計數次數:0

smartpoint2.h

#

include

using std::cout;

using std::endl;

// 原始指標

class baseclass2 ;~

baseclass2()

;};template

class smartpoint2;

// 宣告的類需要加泛型修飾

// 輔助類,使用泛型儲存原始指標

template

class u_ptr2 ;~

u_ptr2()

// 輔助類中的引用計數和原始指標

int count;

t *t_;};

// 智慧型指標,儲存的原始指標泛型實現

template

class smartpoint2

;smartpoint2

(const smartpoint2 &rsp)

:ptr

(rsp.ptr)

// 拷貝賦值

smartpoint2 &operator=

(const smartpoint2 &rsp)

// 拷貝複製if(

--ptr->count ==0)

cout <<

"原來物件計數為"

<< ptr->count << endl;

ptr = rsp.ptr;

++ptr->count;

cout <<

"新物件的引用計數為"

<< ptr->count << endl;

return

*this;

} t &operator*()

// 過載運算子(), 使得智慧型指標可以和原始指標一樣可以使用->運算子

t *operator->()

~smartpoint2()

cout <<

"智慧型指標共享記憶體-1,還剩下計數:"

<< ptr->count << endl;

}private:

u_ptr2

*ptr;

};

main.cpp

#

include

#include

"baseclass.h"

#include

"baseclass2.h"

intmain()

輸出內容:

hello, world!

輔助類初始化,引用計數初始化為1

共享計數增加為2

原來物件計數為1

新物件的引用計數為2

智慧型指標共享記憶體-

1,還剩下計數:1

智慧型指標共享物件為0,釋放記憶體

輔助類析構,原始指標記憶體釋放

智慧型指標共享記憶體-

1,還剩下計數:0

c 實現引用計數智慧型指標

主要的思路是使用乙個int 的指標進行計數,在建構函式時候設定為0,並加1 或者直接設定為1 然後賦值和複製構造時候把int 和資料儲存的指標t mp傳到另外乙個類中。在賦值的時候要注意左邊的指標是否已經有資料了,有資料就要先 1,然後再進行賦值。template class ref1 ref1 c...

引用計數與智慧型指標

c 沒有完善的gc機制,直到c 11才在stl中正式引入了智慧型指標。出現在庫中說明智慧型指標不是語言特性。c 智慧型指標實現了部分自動記憶體管理的目的。引用計數是使用資源管理函式 構造析構複製等函式 和作用域原理實現的。每塊動態分配的記憶體 堆記憶體 都維護乙個相應的計數器,來記錄指向該記憶體的變...

C 引用計數技術及智慧型指標的簡單實現

閱讀目錄 5.智慧型指標類的改進一 6.智慧型指標改進二 正文 一直以來都對智慧型指標一知半解,看c primer中也講的不夠清晰明白 大概是我功力不夠吧 最近花了點時間認真看了智慧型指標,特地來寫這篇文章。回到頂部 簡單來說,智慧型指標是乙個類,它對普通指標進行封裝,使智慧型指標類物件具有普通指標...