智慧型指標是乙個類,它產生的是乙個類物件,而不是乙個原生的指標物件,但是為了減少類物件與針對物件使用的差異性,所以share_ptr類故意過載了兩種常見的指標操作符: *和->。從而share_ptr與普通指標使用方式一樣。簡言之,就是share_ptr生成的乙個包含型別指標容器物件,它封裝了指標物件,對指標物件負全責,包括生成、釋放等。智慧型指標(smart pointer)的一種通用實現技術是使用引用計數(reference count)。智慧型指標類將乙個計數器與類指向的物件相關聯,引用計數跟蹤該類有多少個物件的指標指向同一物件
計數變數設為指標,主要是因為計數是共有的,這樣一方面可以節省記憶體,另一方面可以達到管理共有變數的目的
destroy函式delete指標時不呼叫刪除器
刪除器為乙個可呼叫模板,在呼叫函式中可以用function定義其模式
#ifndef sharepointer_h
#define sharepointer_h
#include "debugdelete.h"
#include
#include
//1.模板成員函式知道使用時編譯器才去編譯
template
class share_pointer
//顯式定義建構函式,傳遞指標管理型別和刪除器物件兩個形參
explicit share_pointer(t *t, std::function d = debugdelete()):t(t),count(new size_t(1)),deleter(d){}
//拷貝建構函式
share_pointer(share_pointer &sp):count(sp.count),t(sp.t),deleter(sp.deleter)
//移動建構函式,share_pointerm(share_pointer(new int(30)))呼叫移動建構函式,若無,則呼叫拷貝建構函式
share_pointer(share_pointer &&sp):count(sp.count),t(std::move(sp.t)),deleter(std::move(sp.deleter))
//賦值建構函式
share_pointer &operator=(share_pointer &sp);
//返回指標指向的值
t& operator*() const
//過載->
t* operator->() const
//reset
void reset()
void reset(t* p)
}void reset(t* p,std::function d)
private:
std::size_t *count;//6.計數為不同物件的公共變數,固定義乙個指標,指向共有記憶體
t *t ;
std::function deleter;
void deconstructor();
};template
inline
void share_pointer::deconstructor()
}t = nullptr;
count = nullptr;
}template
inline share_pointer&share_pointer::operator=(share_pointer &sp)
#endif
#ifndef debugdelete_h
#define debugdelete_h
#include
class debugdelete
//流無法被拷貝
template
void
operator()(t* t)const
private:
std::ostream &os;//流無法被拷貝
};#endif
#include "debugdelete.h"
#include
#include "share_pointer.h"
#include
#include
#include
#include
int _tmain(int argc, _tchar* argv)
資源共享型智慧型指標實現方式簡述
資源共享型智慧型指標實現方式簡述 資源共享型的智慧型指標有兩種實現方式 一種是侵入式 一種是非侵入式。網上以及書籍比較常見的是非侵入式的,它的實現完全放在智慧型指標模板類內。模板類有乙個用於儲存資源類物件的指標變數和乙個用於記錄資源物件引用計數的指標變數。兩者是所有的智慧型指標物件共享的,所以通過指...
智慧型指標之共享指標
智慧型指標是儲存指向動態分配物件指標的類。三種智慧型指標 std shared ptr std unique ptr std weak ptr.使用時需要加上標頭檔案 include 1.共享智慧型指標 shared ptr 初始化 shared ptr初始化可以通過reset方法初始化shared...
共享智慧型指標 SharePtr 的C 實現
主要實現思想是引用計數法,在shareptr類拷貝 copy 和賦值 的時候引用計數加1,而在shareptr類變數析構的時候引用計數減少1 1 shareptr包裹類變數指標和引用計數指標int 這裡引用計數採用 int 為了在各個shareptr變數實現計數共享,每個變數的計數變化都會影響其他計...