智慧型指標(使用計數) 定義值型類

2021-09-09 03:08:25 字數 1897 閱讀 1129

1、什麼是使用計數?

使用計數是複製控制成員中使用的程式設計技術。將乙個計數器與類指向的物件相關聯,用於跟蹤該類有多少個物件共享同一指標。建立乙個單獨類指向共享物件並管理使用計數。由建構函式設定共享物件的狀態並將使用計數置為1。每當由複製建構函式或賦值操作符生成乙個新副本時,使用計數加1。由析構函式撤銷物件或作為賦值操作符的左運算元撤銷物件時,使用計數減少1。賦值操作符和析構函式檢查使用計數是否已減至0,若是,則撤銷物件。

2、什麼是智慧型指標?智慧型指標如何與實現普通指標行為的類相區別?

智慧型指標是乙個行為類似指標但也提供其他功能的類。這個類與實現普通指標行為的類區別在於:智慧型指標通常接受指向動態分配物件的指標並負責刪除該物件。使用者分配物件,但由智慧型指標類刪除它,因此智慧型指標類需要實現賦值控制成員來管理指向共享物件的指標。只有在撤銷了指向共享物件的最後乙個智慧型指標後,才能刪除該共享物件。使用計數就是實現智慧型指標類最常用的乙個方式。智慧型指標可防止懸垂指標。

3、什麼是值型類?

是指具有值語義的類,其特徵是:對該類物件進行賦值時,會得到乙個不同的新副本,對副本所做的改變不會影響原有物件。

使用計數式hasptr類的版本

1

class u_ptr //

這個類的所有成員都是 private 的

27 ~u_ptr()8};

910class

hasptr

1114 hasptr(const hasptr &orgi):ptr(orgi.ptr), val(orgi.val)

15 hasptr& operator = (const hasptr&);

16 ~hasptr()

1718

int *get_ptr() const

1922

int get_int() const

2326

void set_ptr(int *p)

2730

void set_int(int

i)31

34int get_ptr_val() const

3538

void set_ptr_val(int

i)39

42private

:43 u_ptr *ptr; //

points to use-counted u_ptr class

44int

val;

45};

4647 hasptr& hasptr::operator = (const hasptr &rhs)

48

實現值型hasptr類版本

1

class

hasptr25

6 hasptr( const hasptr &rhs ): ptr( new

int (*rhs.ptr) ), val(rhs.val)

78 hasptr& operator=( const hasptr&rhs)

914 ~hasptr()

15int *get_ptr() const

1617

int get_ptr_val() const

18int get_int() const

1920

void set_ptr( int *p )

21void set_int( int i )

2223

void set_ptr_val( int p ) const

2427

private:28

int *ptr;

29int

val;

30 };

引用計數與智慧型指標

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

基於引用計數的智慧型指標

pragma once include includeusing namespace std templateclass smartpointer smartpointer smartpointer src 拷貝建構函式 t operator 操作符過載,注意返回型別 t operator 操作符過...

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

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