中間兩次筆記被刪掉了,簡單補一下:java
Item 3 中提到若是將對象直接放入容器中,可能會引起問題:c++
- 大量的拷貝行爲要求對象的拷貝構造代價要小
- 試圖將派生類放入存放基類的容器中會引起 Slicing 問題。
對此的簡單方法就是在容器中保存對象 指針 ,但若是直接保存指針的話,咱們須要本身維護和管理內存,容易混亂。最好的方法是保存 智能指針(smart pointer shared_ptr)) 。sql
須要注意的是,這裏提倡的是 shared_ptr,不是 autoptr,C++ 標準要求不能聲明存放 autoptr 的容器 (Container of AutoPtr, COAP)。緣由在於,根據定義,AutoPtr 的 Copy 要求將對象的全部權 (ownership) 轉給新的 AutoPtr:bash
1: auto_ptr<int> p1(new int(1)); 2: auto_ptr<int> p2(p1); 3: p1 = p2;
上面的示例中,第一行新建了一個 AutoPtr 對象 p1 用於包裝一個 int 指針,第一行執行後,p2 接手了該指針,同時,p1 指向 / NULL / 。第三行執行後, p1 從新獲取指針,但 p2 被指向 / NULL / 。post
假設若是咱們聲明瞭一個用於存放 autoptr 的容器 COAP ,那麼在對 COAP 進行操做時,對象的全部權將不可避免的會轉移給其餘的對象,最後致使容器中的 AutoPtr 指向 NULL ,從而引起各類問題。spa