動態內存
每個程序有一個內存池,稱為堆,用於存儲動態分配的對象,即那些在程序運行時分配的對象。動態對象的生存周期由程序來控制,也就是說,當動態對象不再使用時,我們的代碼必須顯示的銷毀他們。
使用懂態內存是十分必要的額,但眾所周知,正確管理動態內存是十分棘手的。比如忘記釋放內存就會產生內存泄漏。有時尚有指針引用指向內存但被釋放了,就會產生野指針。因此產生了智能指針。c++11提供了三種包括:shared_ptr,unique_ptr,weak_ptr.
shared_ptr詳解
所用到的技術就是引用技術,引用計數關聯到具體的object。當指向這個object的shared_ptr增加時,引用計數自加,減少時,引用計數減少。當引用技術為0時釋放改object。引用計數自增發生在初始化,賦值時。自減發生在賦值,析構時。
shared_ptr<T> sp; 空智能指針。
constexpr shared_ptr(nullptr_t) : shared_ptr() {}
template <class U> explicit shared_ptr (U* p) 不支持隱式轉換。
template <class U> shared_ptr (const shared_ptr<U>& x) noexcept;
template <class U> shared_ptr (shared_ptr<U>&& x) noexcept;
template <class U> shared_ptr& operator= (const shared_ptr<U>& x) noexcept;
template <class U> shared_ptr& operator= (shared_ptr<U>&& x) noexcept;
p 用p作為一個條件判斷,若p指向一個對象則為true。
*p 解引用p,獲得它指向的對象
p->men 等價於(*p).men
p.get() 返回p中保存的指針
swap(p,q) 交換p,q中的指針
p.swap(q)
make_shared<T>(args) 返回一個shared_ptr,指向一個動態分配的類型為T的對象,用args初始化。
shared_ptr<T>p(q)
p=q
p.unique() 若p.use_count()為1,返回true,否則返回false。
p.use_count() 返回p共享對象的智能指針數量,用於調試。
當第一個智能指針被創建,唯一來源通過shared_ptr<T> p(new T); 或 shared_ptr<T> p=make_shared<T>();。另外一種情況T* p=new T;shared_ptr<T> q(p);這種會產生野指針,故不應這么寫。第一個智能指針,通過拷貝構造,拷貝賦值(或被其他智能指針賦值的此類智能指針)所衍生出來的智能指針共享一個引用計數。成員函數get不應通過獲得的指針進行釋放,初始化一個智能指針。
unique_ptr
某個時刻只能有一個unique_ptr指向一個給定對象。當unique_ptr被銷毀時,它所指向的對象也被銷毀了。
與shanred_ptr不同,沒有類似make_shared的表標准庫返回一個unique_ptr.當我們定義一個unique_ptr時,需要其綁定一個new返回的指針上。此種初始化方式為顯示的。
由於一個unique_ptr擁有它指向的對象,因此unique_ptr不支持普通的拷貝或復制操作。