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