1.1rall
rall:是一種利用物件生命週期來控制程式資源的簡單技術
在物件構造的時候獲取資源,接著控制對資源的訪問之在物件生命週期期間內始終保持有效,最後在物件析構的時候釋放資源,這樣做的好處有兩個
1.不需要顯示的釋放記憶體
2.採用這種方式,物件所需的資源在生命週期內始終有效
舉個例子(丟擲異常無法釋放記憶體)
templateclass smartptr
~smartptr() }
private:
t* _ptr;
};double division(int a, int b)
void func()
int main()
catch (const char* errmsg)
system("pause");
return 0;
}
1.2只能指標的原理
上述的smartptr還不能將其稱為智慧型指標,因為它不具有指標的行為,所以必須過載解引用和->訪問空間所指的內容才構成智慧型指標。
即在smartptr類中過載:
t& operator*()
~unique_ptr() }
//過載* ->
t& operator*()
t* operator->()
private:
unique_ptr(const unique_ptr& up);
unique_ptr& operator=(const unique_ptr& up);
\*unique_ptr(const unique_ptr& up) = delete;
unique_ptr& operator=(const unique_ptr& up) = delete;*/
t* _ptr;
}1.5std::share_ptr
c++11中開始提供更靠譜的並且支援拷貝的shared_ptr
share_ptr的基本原理就是::是通過引用計數的方式來實現多個shared_ptr物件之間共享資源。
shared_ptr在其內部,給每個資源都維護了著乙份計數,用來記錄該份資源被幾個物件共享。
在物件被銷毀時(也就是析構函式呼叫),就說明自己不使用該資源了,物件的引用計數減一。
如果引用計數是0,就說明自己是最後乙個使用該資源的物件,必須釋放該資源;
如果不是0,就說明除了自己還有其他物件在使用該份資源,不能釋放該資源,否則其他物件就成野指 針了。
模擬實現share_ptr如下:
template class share_ptr
share_ptr(const share_ptr& sp)
:_ptr(sp._ptr)
, use_count(sp.use_count)
, _mtx(sp._mtx)
share_ptr& operator=(const share_ptr& sp)
_ptr = sp._ptr;
use_count = sp.use_count;
_mtx = sp._mtx;
addref();
} return this;
} int addref()
int subref()
~share_ptr()
}} //過載* ->
t& operator*()
t* operator->()
int usecount()
private:
t* _ptr;
int* use_count;
//加鎖,給乙個全域性的鎖代價太大
mutex* _mtx;
};struct date
};void fun(const share_ptr& sp,int n)
int main()
模擬實現智慧型指標
智慧型指標可以用來管理資源,原自構造析構函式 raii 還可以像原生指標一樣使用。auto ptr 管理許可權的轉移。scoped ptr 防拷貝。shared ptr 引用計數解決auto ptr的缺陷。其中shared 自身帶有一定缺陷,迴圈引用,和不可釋放陣列類,檔案類等資源,幸運的是它支援定...
智慧型指標的模擬實現
1.引入 int main 在上面的 中定義了乙個裸指標p,需要我們手動釋放。如果我們一不小心忘記釋放這個指標或者在釋放這個指標之前,發生一些異常,會造成嚴重的後果 記憶體洩露 而智慧型指標也致力於解決這種問題,使程式設計師專注於指標的使用而把記憶體管理交給智慧型指標。普通指標也容易出現指標懸掛問題...
模擬實現智慧型指標SharedPtr
首先我們先來乙個小小的區分三個智慧型指標 1,autoptr 管理權的轉移 嚴重缺陷,盡量不要使用 2,scopedptr 簡單粗暴 防拷貝 只宣告不定義 3,sharedptr 共享,引用計數,功能強大,迴圈引用,但是較為複雜 下面我們來模擬實現一下sharedptr template t cla...