智慧型指標 轉

2022-07-25 01:18:27 字數 2315 閱讀 3250

1、智慧型指標的作用

c++程式設計設計中使用堆記憶體是非常頻繁的操作,堆記憶體的申請和釋放都由程式設計師自己管理。程式設計師自己管理記憶體可以提高程式的效率,但是整體來說堆記憶體的管理是麻煩的,c++11中引入了智慧型指標的概念,方便管理記憶體。使用普通指標,容易造成堆記憶體洩露(忘記釋放),二次釋放,程式發生異常時記憶體洩露等問題,使用智慧型指標能更好的管理堆記憶體。

智慧型指標從下面三個層次理解:

1、從較淺的層面,智慧型指標是利用叫做rall(資源獲取即初始化)的技術對普通的指標進行封裝,這使得智慧型指標實質是乙個物件,行為表現的卻像乙個指標。

2、智慧型指標的作用是防止忘記呼叫delete釋放記憶體和程式異常的進入catch塊忘記釋放記憶體。另外指標的釋放時機也是非常有講究的,多次釋放同乙個指標會造成程式崩潰,這些都可以通過智慧型指標來解決。

3、智慧型指標還有乙個作用是把值語義轉換成引用語義。

2、智慧型指標的使用

智慧型指標在c++11版本之後提供,包含在標頭檔案中,shared_ptr、unique_ptr、weak_ptr

2.1、shared_ptr的使用

shared_ptr多個指標指向相同的物件。shared_ptr使用引用計數,每乙個shared_ptr的拷貝都指向相同的記憶體。每使用它一次,內部的引用計數加1,每析構一次,內部的引用計數減1,減為0時,自動刪除所指向的堆記憶體。

shared_ptr內部的引用計數是執行緒安全的,但是物件的讀取需要加鎖。

1、初始化。智慧型指標是個模板類,可以指定型別,傳入指標通過建構函式初始化。也可以使用make_share函式初始化。不能將指標直接賦值給乙個智慧型指標,乙個是類,乙個是智慧型指標。

2、拷貝和賦值。拷貝使得物件的引用計數增加1,賦值使得原物件引用計數減1,當計數為0時,自動釋放記憶體。後來指向的物件引用計數加1,指向後來的物件。

3、get函式獲取原始指標。

4、注意不要用乙個原始指標初始化多個shared_ptr,否則會造成二次釋放同一記憶體。

5、注意避免迴圈引用,shared_ptr的乙個最大的陷阱是迴圈引用,迴圈引用會導致堆記憶體無法正確釋放,導致記憶體洩露。迴圈引用在weak_ptr中介紹。

#includeusing

namespace

std;

intmain()

2.2、unique_ptr的使用

unique_ptr「唯一」擁有其所指向物件,同一時刻只能有乙個unique_ptr指向給定物件(通過禁止拷貝語義、只有移動語義來實現)。相比與原始指標unique_ptr用於其rall的特性,使得在出現異常的情況下,動態資源能得到釋放。unique_ptr指標本身的生命週期:從unique_ptr指標建立時開始,直到離開作用域。離開作用域時,則將其所指物件銷毀(預設使用delete操作符,使用者可以指定其它操作)。unique_ptr指標與其所指物件的關係:在智慧型指標生命週期內,可以改變智慧型指標所指物件,如建立智慧型指標時通過建構函式指定、通過reset方法重新指定、通過release方法釋放所有權、通過移動語義轉移所有權。

#includeusing

namespace

std;

intmain()

2.3、weak_ptr的使用

weak_ptr是為了配合shared_ptr而引入的一種智慧型指標,因為它不具有普通指標的行為,沒有過載operator*和->,它的最大作用在於協助shared_ptr工作,像旁觀者那樣觀測資源的使用情況。weak_ptr可以從乙個shared_ptr或者另乙個weak_ptr物件構造,獲得資源的觀測權。但weak_ptr沒有共享資源,它的構造不會引起指標引用計數的增加。一旦最後乙個指向物件的shared_ptr被銷毀,物件就會被釋放,即使有weak_ptr指向物件,物件也會被釋放。

weak_ptrw  //空weak_ptr可以指向型別為t的物件

w.reset()  //將w置空

w.use_count()  //與w共享物件的shared_ptr的數量

w.expired()  //若w.use_count()為0,返回true,否則返回false

w.lock()  //如果expired為true,返回乙個空shared_ptr,否則返回乙個指向w的物件的shared_ptr

#includeusing

namespace

std;

intmain()

return0;

}

智慧型指標 強弱智慧型指標

在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...

智慧型指標學習

最近接觸到智慧型指標很多,於是研究了一下智慧型指標的原理,寫下自己的心得體會,有不對的還請指正。智慧型指標產生的目的 因為在c 中,存在非常複雜的指標錯誤問題,例如,某個物件生成後,指向該物件的指標可能有多個,當我們用delete語句刪除其中的乙個指標後,物件就被銷毀,那麼其餘指向該物件的指標就會懸...

智慧型指標3

include include using namespace std define test smartptr class stub class sentry sentry private int lock template class refcountingtraits void unrefer...