智慧型指標的使用和模擬實現

2021-09-22 20:17:00 字數 1973 閱讀 3480

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...