智慧型指標剖析

2021-08-21 08:28:34 字數 2078 閱讀 6296

c++11中引入了智慧型指標包括auto_ptr、shared_ptr、weak_ptr、unique_ptr

我們在寫c++程式時,動態記憶體需要自己維護,動態開闢的空間,在出函式作用域或者程式正常退出前必須釋放,否則會造成記憶體洩露

void fun()
在do something時,如果出現了異常或者其他原因,導致提前結束離開函式,那麼new出來的記憶體將不會被釋放,而使用智慧型指標管理這塊記憶體時,會通常在智慧型指標本身被析構時,正確釋放new出來的空間。引入智慧型指標的作用是為了保證在出現異常時,也能保證堆記憶體會被釋放掉

在c++中,通過rall(資源分配)實現智慧型指標。

定義乙個類來封裝資源的分配和釋放,在建構函式完成資源對的分配和初始化,在析構函式完成資源的清理,可以保證資源的正確初始化和釋放。

通過資源轉移機制來實現的。

hljs haskell">class

autoptr

autoptr

(autoptr

&p)autoptr

&operator=(autoptr

&p)_ptr = p._ptr;

p._ptr = null;

}return *this;

}~autoptr

()

}t& operator*()

t operator->()

private:

t* _ptr;

};

在這種機制下,我們實現的拷貝構造和賦值運算子過載,將原有資源交給新的物件來管理,同時將原有空間的管理許可權交出去。

那麼怎麼處理這種問題呢?(防拷貝)

template

t>

class

autoptr

~autoptr

()

}t& operator*()

t operator->()

private:

autoptr

(autoptr

&p);

autoptr

&operator=(autoptr

&p);

private:

t* _ptr;

};

auto_ptr是不建議使用的。

shared_ptr和auto_ptr實現基本是一樣的,s**hared_ptr維護了乙個足夠大的引用計數,保證在引用計數歸為0時正確釋放堆中的記憶體**。share_ptr使用的引用計數類是refcount.

我們用以下的**剖析一下迴圈引用的底層是什麼?

首先在棧中構造了兩個智慧型指標pa,pb,分別管理一塊具有雙向鍊錶結點的空間。各自的引用計數為1。pa->next=pb;pb->pre=pa;使得各自的引用計數變為2。所以在析構pa和pb時,引用計數都不為0,於是產生了迴圈引用,導致記憶體洩露。

對於迴圈引用這個問題,引出了weak_ptr。

weak_ptr不會增加shared_ptr的引用計數,析構時會正確釋放記憶體。

當我們釋放pb指向的空間時,pb引用計數結構體中use-1,weak-1,pa的引用計數結構體中weak-1.

shared_ptr是用來共享記憶體的,weak_ptr是用來避免迴圈引用的。使用weak_ptr時需要用lock檢查weak_ptr儲存的的指標是否有效。

是一種特殊的shared_ptr,其拷貝建構函式和運算子過載是刪除的,意味著我們初始化乙個unique_ptr,它會獨佔記憶體。

智慧型指標剖析

c 中,動態記憶體的開闢需要使用者自己管理,在使用完成之後,必須由使用者自己來釋放空間,當然,大部分程式設計師都會說,我肯定會記得釋放的,然而,對於這個問題,我們還是防不勝防,一不小心就會造成記憶體洩露。在這樣的情況下,我們為何不把開闢的空間交給智慧型指標來管理呢?這樣即高效又不容易出問題。c 中,...

智慧型指標share ptr 簡單剖析

本文 話不多說直接上碼!shared ptr的簡單實現版本 基於引用記數的智慧型指標 namespace boost 空間庫boost templateshared ptr y py shared ptr constshared ptr r px r.px templateshared ptr co...

智慧型指標scoped ptr原始碼剖析

智慧型指標scoped ptr原始碼剖析 以下為簡化後的原始碼實現 include include include include using namespace std scoped ptr 指向乙個物件,死活不肯交出資源佔有權 私有的複製建構函式和賦值運算子 除非你和我一樣 swap scope...