動態內存和智能指針

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指向相同的對象,此對象有兩個引用者

相關文章
相關標籤/搜索