1. 程式人生 > >智慧指標和異常、 weak_ptr、unique_ptr

智慧指標和異常、 weak_ptr、unique_ptr

12.1.4智慧指標和異常

1.在塊中建立的動態記憶體,如果是由內建指標來指向這塊記憶體,那麼若是在塊結束時未delete這個指標,則該記憶體不會被釋放,若在delete之前發生異常,由於還沒執行delete操作,記憶體也不會被釋放;但若是由智慧指標來指向這塊記憶體,那無論是否發生異常,都能在正確時間釋放記憶體,正常是在塊結束處,異常則是在異常處。

2.使用智慧指標應遵守的規範:

(1)不使用相同的內建指標初始化(或reset)多個智慧指標。

(2)不delete get()返回的指標。

(3)不使用get()初始化或reset另一個智慧指標。

(4)如果你使用get()返回的指標,記住當最後一個對應的智慧指標銷燬後,你的指標就變為無效了。

(5)如果智慧指標管理的資源不是new分配的記憶體,應傳遞給它一個刪除器。

12.1.5 unique_ptr

1.Unique_ptr的定義有兩種初始化方式:

Unique_ptr<T> p(new T ())和unique_ptr<T> p(q),q是一個指向動態分配的物件的指標,

2.unique_ptr指標不能簡單拷貝和賦值,只能通過release成員和reset成員來轉移物件的所有權。p.release()返回一個指向原物件的unique_ptr指標,並將p 指標置空,p.reset(q)作用和shared_ptr的reset成員一樣,若引數列表為空則釋放p指向的物件,否則釋放p指向的物件後,令p指向q所指物件。兩個函式通常的搭配為p2.reset(p3.release()).

3.unique_ptr雖然一般不能拷貝和賦值,但有例外,我們可以拷貝或賦值一個將要被銷燬的unique_ptr,常見的例子是從函式中返回一個unique_ptr或一個區域性物件的拷貝。

4.u = nullptr釋放u指向的物件,將u置為空。

5.過載刪除器,unique_ptr<T, D> u(d);用型別為D的物件d代替delete釋放u所指物件並將u置空。

12.1.6 weak_ptr

1.weak_ptr必須繫結到一個shared_ptr,但是它不會使shared_ptr的引用計數增加,一旦最後一個指向物件的shared_ptr被其解構函式或其他自定義的可呼叫函式delete掉,那麼該記憶體物件就會被釋放,因為這個性質,所以它不能控制物件的生存週期,不能改變物件的任何屬性,只起一個指向的作用。

2.不能解引用一個weak_ptr指標,也不能用cout輸出一個weak_ptr的內容,也就是物件的地址。(原因有待探索)

3.常用成員函:w.expired(),其繫結的共享指標數量為0,則返回真,否則返回假;w.lock(),繫結的共享指標數量為0,則返回一個空的共享指標,否則返回一個指向物件的共享指標。

4.建立一個weak_ptr時,要用一個shared_ptr來初始化它:weak_ptr<int> wp(p);

weak_ptr<int> wp(make_shared<int>(12));雖然合法,但是因為weak_ptr是弱共享,無法對物件進行任何操作,所以這樣定義是沒有意義的,此情況下不能用一個weak_ptr來初始化一個shared_ptr,但若是weak_ptr原來就綁定了其他共享指標,則可以初始化一個shared_ptr.