中间两次笔记被删掉了,简单补一下: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