c++中動態內存的管理是經過一對運算符來完成的:new。在動態內存中爲對象分配空間並返回一個指向該對象的指針,咱們呢,能夠選擇對對象進行初始化,delete接受一個動態對象的指針,銷燬該對象,並返回與之關聯的內存。c++
動態內存的使用的不足:安全
1.保證在正que的時間釋放內存是及其困難函數
2.有時咱們會忘記釋放內存,這樣就致使內存泄漏指針
3.有時還存在引用內存的狀況,可是咱們已經釋放了它,這樣就致使非法內存的指針調試
這樣就產生了智能指針(smart pointer)來動態管理內存,智能指針優勢:對象
1.行爲相似常規指針內存
2.負責自動釋放所指向的對象。get
shared_ptr容許多個指針指向同一個對象,unique則是獨佔所指向的對象,weak_ptr是一種弱引用,指向shared_ptr管理的對象。他們都定義在memory頭文件中。string
shared_ptr類模板
智能指針是模板,當咱們建立一個智能指針時候,必須提供額外信息------指針能夠指向的類型,與vector同樣,咱們在<>中給出類型,以後就是所定義的這種智能指針的名字:
shared_ptr<string> p1;//shared_ptr能夠指向string。
shared_ptr<list<int>> p2;//shared_ptr能夠指向int的list
默認初始化時,它將是一個空指針。
解引用一個智能指針返回他的指向對象。
下面是shard_ptr和unique_ptr都支持的操做
shared_ptr<T> sp;unique_ptr<T> up;//空智能指針,能夠指向類型爲T的對象
p //將p做爲一個條件判斷,若p指向一個對象,則爲true
*p //解引用p,得到它指向的對象
p->mem,//等價於(*p).mem;
p.get() //返回p中保存的指針,可是要當心使用,若智能指針釋放了其對象,返回的指針所指向的對象也就消失。
swap(p,q)//交換p和q的指針。
p.swap(q) //交換p和q的指針
下面是shared_ptr獨有的操做:
make_shared<T>(args) //返回一個shared_ptr,指向一個動態分配的類型爲T的對象,使用args初始化此對象。
shared_ptr<T>p(q);//p是shared_ptr q的拷貝;此操做會遞增q中的計數器,q中的指針必須能轉換爲T。
p = q //p和q都是shared_ptr,所保存的指針必須能相互轉換,此操做會減小p的引用計數,若p的引用計數變爲0,則將其管理的原內存釋放。
p.unique() //若p.use_count()爲1,返回true;不然返回false;
p.use_count(()// 返回與p共享對象的智能指針數量,可能很慢,主要用於調試。
make_shared函數是最安全分配和使用動態內存的方法,此函數在動態內存中分配一個對象並初始化它,返回指向此對象的shared_ptr。
shared_ptr<int> p3 = make_shared<int>(42);//指向一個值爲42的int的shared_ptr;
shared_ptr的拷貝和賦值
當進行拷貝和賦值時,每一個shared_ptr都會記錄有多少個其餘shared_ptr指向相同的對象。
auto p = make_shared<int>(42);//p指向的對象只有一個引用者;
auto p(q); //p和q指向相同的對象,此對象有兩個引用者