1、什麼是使用計數?
使用計數是複製控制成員中使用的程式設計技術。將乙個計數器與類指向的物件相關聯,用於跟蹤該類有多少個物件共享同一指標。建立乙個單獨類指向共享物件並管理使用計數。由建構函式設定共享物件的狀態並將使用計數置為1。每當由複製建構函式或賦值操作符生成乙個新副本時,使用計數加1。由析構函式撤銷物件或作為賦值操作符的左運算元撤銷物件時,使用計數減少1。賦值操作符和析構函式檢查使用計數是否已減至0,若是,則撤銷物件。
2、什麼是智慧型指標?智慧型指標如何與實現普通指標行為的類相區別?
智慧型指標是乙個行為類似指標但也提供其他功能的類。這個類與實現普通指標行為的類區別在於:智慧型指標通常接受指向動態分配物件的指標並負責刪除該物件。使用者分配物件,但由智慧型指標類刪除它,因此智慧型指標類需要實現賦值控制成員來管理指向共享物件的指標。只有在撤銷了指向共享物件的最後乙個智慧型指標後,才能刪除該共享物件。使用計數就是實現智慧型指標類最常用的乙個方式。智慧型指標可防止懸垂指標。
3、什麼是值型類?
是指具有值語義的類,其特徵是:對該類物件進行賦值時,會得到乙個不同的新副本,對副本所做的改變不會影響原有物件。
使用計數式hasptr類的版本
1class 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類版本
1class
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...