主要實現思想是引用計數法,在shareptr類拷貝(copy)和賦值(=)的時候引用計數加1,而在shareptr類變數析構的時候引用計數減少1
(1)shareptr包裹類變數指標和引用計數指標int*, 這裡引用計數採用 int* 為了在各個shareptr變數實現計數共享,每個變數的計數變化都會影響其他計數
enum ethreadtype
;templateclass shareptr
//賦值構造
shareptr& operator=(const shareptr& other)
void assignment(const shareptr& other)
if (ethreadtype::multithread == threadtype)
threadmutex.unlock();
}
(3)析構引用計數減少1,當減少為0,則析構共享指標儲存的物件的記憶體
void decrease()
delete count;
count = nullptr;
}} if (ethreadtype::multithread == threadtype)
threadmutex.unlock();
} ~shareptr()
(4)共享指標shareptr總體實現,設計了makeshared模板函式實現了不定形參,支援模板類物件的建構函式不定形參,和c++ stl的make_shared具備相同的效果
enum ethreadtype
;templateclass shareptr
//拷貝構造,相當於shareptr(const shareptr& other)
shareptr(const shareptr& other)
//賦值構造
shareptr& operator=(const shareptr& other)
objecttype* operator->()
~shareptr()
private:
void assignment(const shareptr& other)
if (ethreadtype::multithread == threadtype)
threadmutex.unlock();
} void decrease()
delete count;
count = nullptr;
}} if (ethreadtype::multithread == threadtype)
threadmutex.unlock();
}public:
templatevoid initobject(args&&...args)
if (nullptr != count)
objectptr = new objecttype(std::forward(args)...);
count = new int;
*count = 1;
} templatefriend shareptrmakeshared(args&&...args);
};//發生拷貝構造在析構
templateshareptrmakeshared(args&&...args)
(5)shareptr不提供直接new構造物件的函式,是考慮到智慧型指標的濫用,二次gc導致delete空指標而程式崩潰, 僅僅開放出makeshared介面來返回共享指標物件。 下面的用stl的共享指標shared_ptr濫用導致程式崩潰
class uobject
~uobject()
float getvalue()
private:
float value;
};void func()
int main()
正確使用樣例:
(6)因為是玩具版共享指標,沒有像stl的共享指標一樣使用atomic計數器,更無法解決共享指標的多執行緒安全問題
智慧型指標share ptr記錄
shared ptr 是乙個共享所有權的智慧型指標,允許多個指標指向同乙個物件。shared ptr 物件除了包括乙個物件的指標,還包括乙個引用計數器。當每給物件分配乙個share ptr的時候,引用計數加一 每reset乙個share ptr,或者修改物件的指向 指向其他物件或者賦值nullptr...
智慧型指標share ptr 簡單剖析
本文 話不多說直接上碼!shared ptr的簡單實現版本 基於引用記數的智慧型指標 namespace boost 空間庫boost templateshared ptr y py shared ptr constshared ptr r px r.px templateshared ptr co...
智慧型指標之共享指標
智慧型指標是儲存指向動態分配物件指標的類。三種智慧型指標 std shared ptr std unique ptr std weak ptr.使用時需要加上標頭檔案 include 1.共享智慧型指標 shared ptr 初始化 shared ptr初始化可以通過reset方法初始化shared...