練習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進行顯式釋放,則會出現二次銷毀。