天天看點

第十二章 12.1.3節練習

練習12.10

下面的代碼調用了第413頁中定義的process函數,解釋此函數調用是否正确。如果不正确,應如何修改?

shared_ptr<int> p(new int(42));
process(shared_ptr<int>(p));
           

解答:

這裡和413頁的結果是一樣的,在process運作過程中,引用數值至少為2。

當process結束時,ptr的引用計數會遞減,但不會變為0。

是以,當局部變量ptr被銷毀時,ptr指向的記憶體不會被釋放。

這裡除了将process的參數改成引用,還要将

process(shared_ptr<int>(p));
           

還原為

process(p);
           

這樣就能保證在process運作時,引用數值為1了。

練習12.11

如果我們想下面這樣調用process,會發生什麼?

process(shared_ptr<int>(p.get()));
           

解答:

這裡的情況和413頁,process(shared_ptr<int>(x))應該是一緻的。

因為get()傳回的就是智能指針儲存的一般指針。

練習12.12

p和q的定義如下,對于接下來對process的每個調用,如果合法,解釋它做了什麼,如果不合法,解釋錯誤原因:

auto p = new int();
auto sp = make_shared<int>();
           
(a) process(sp);
(b) process(new int());
(c) process(p);
(d) process(shared_ptr<int>(p));
           

解答:

(a) 合法的,對于sp進行了初始化,process可以對其進行使用。

(b) 非法的,不能将*int轉換為一個shared_ptr<int>指針

(c) 非法的,同 (b)

(d) 合法的,但當函數結束時,記憶體會被釋放。

練習12.13

如果執行下面的代碼,會發生什麼?

auto sp = make_shared<int>();
auto p = sp.get();
delete p;
           

解答:

應該會發生二次銷毀的錯誤。這裡由get()得到的指針,不應由delete去删除。

當智能指針對象被銷毀時,這段記憶體也會随之釋放。

擋在這裡使用delete進行顯式釋放,則會出現二次銷毀。

繼續閱讀