c++11智慧型指標介紹:
c++11中智慧型指標的原理、使用、實現
c++11智慧型指標解析——揭開底層面紗,完整理解智慧型指標:
shared_ptr
使用 c++11 智慧型指標時要避開的 10 大錯誤:
shared_ptr多個指標指向相同的物件。shared_ptr使用引用計數,每乙個shared_ptr的拷貝都指向相同的記憶體。每使用他一次,內部的引用計數加1,每析構一次,內部的引用計數減1,減為0時,自動刪除所指向的堆記憶體。shared_ptr內部的引用計數是執行緒安全的,但是物件的讀取需要加鎖。
#include
#include
int main()
}
unique_ptr「唯一」擁有其所指物件,同一時刻只能有乙個unique_ptr指向給定物件(通過禁止拷貝語義、只有移動語義來實現)。相比與原始指標unique_ptr用於其raii的特性,使得在出現異常的情況下,動態資源能得到釋放。
unique_ptr指標本身的生命週期:從unique_ptr指標建立時開始,直到離開作用域。離開作用域時,若其指向物件,則將其所指物件銷毀(預設使用delete操作符,使用者可指定其他操作)。
unique_ptr指標與其所指物件的關係:在智慧型指標生命週期內,可以改變智慧型指標所指物件,如建立智慧型指標時通過建構函式指定、通過reset方法重新指定、通過release方法釋放所有權、通過移動語義轉移所有權。
#include
#include
int main()
//超過uptr的作用域,記憶體釋放
}
[記憶體管理]智慧型指標的好幫手weak_ptr:
weak_ptr是為了配合shared_ptr而引入的一種智慧型指標,因為它不具有普通指標的行為,沒有過載operator*和->,它的最大作用在於協助shared_ptr工作,像旁觀者那樣觀測資源的使用情況。weak_ptr可以從乙個shared_ptr或者另乙個weak_ptr物件構造,獲得資源的觀測權。但weak_ptr沒有共享資源,它的構造不會引起指標引用計數的增加。使用weak_ptr的成員函式use_count()可以觀測資源的引用計數,另乙個成員函式expired()的功能等價於use_count()==0,但更快,表示被觀測的資源(也就是shared_ptr的管理的資源)已經不復存在。
weak_ptr可以使用乙個非常重要的成員函式lock()從被觀測的shared_ptr獲得乙個可用的shared_ptr物件, 從而操作資源。但當expired()==true的時候,lock()函式將返回乙個儲存空指標的shared_ptr。
#include
#include
int main()
}//delete memory
}
c++11智慧型指標之weak_ptr:
#include
#include
#include
using
namespace
std;
class classb;
class classa
~classa()
shared_ptr
pb; // 在a中引用b
};class classb
~classb()
shared_ptr
pa; // 在b中引用a
};int main()
上面**的輸出如下:
classa constructor...
classb
constructor...
從上面**中,classa和classb間存在著迴圈引用,從執行結果中我們可以看到:當main函式執行結束後,spa和spb管理的動態資源並沒有得到釋放,產生了記憶體洩露。
weak_ptr並不改變其所共享的shared_ptr例項的引用計數,那就可能存在weak_ptr指向的物件被釋放掉這種情況。這時,我們就不能使用weak_ptr直接訪問物件。那麼我們如何判斷weak_ptr指向物件是否存在呢?c++中提供了lock函式來實現該功能。如果物件存在,lock()函式返回乙個指向共享物件的shared_ptr,否則返回乙個空shared_ptr。
示例:
class a
~a()
int a;
};int main()
else
}
所以在存在迴圈引用的兩個類之中,把引用對方的類指標寫為weak_ptr可以避免迴圈引用一直不釋放資源的情況。
class classb;
class classa
~classa()
weak_ptrpb; // 在a中引用b
};class classb
~classb()
weak_ptrpa; // 在b中引用a
};int main()
C 11智慧型指標
本文介紹c 的四種智慧型指標,其中後三種是c 11新增加的,auto ptr已被棄用。要編譯c 11,需要安裝g 4.8 sudo add apt repository ppa ubuntu toolchain r test sudo apt get update sudo apt get inst...
c 11 智慧型指標
如果在程式中使用new從堆 自由儲存區 分配記憶體,等到不需要時,應使用delete將其釋放。c 引入了智慧型指標auto ptr,以幫助自動完成這個過程。c 11摒棄了auto ptr,並新增了三種智慧型指標 unique ptr,shared ptr,weak ptr。一.auto ptr,un...
c 11 智慧型指標
首先來看shared ptr,先貼一小部分vs2013裡的實現 template class shared ptr template class shared ptr public ptr base ty template explicit shared ptr ux px template cla...