###C++ Primer第5版 学习笔记
####第十二章
- 定义 shared_ptr 时常使用 make_shared 函数和 auto,如
auto p = make_shared<vector<string>>(5, "aaa");
,这种带初始化的,括号中的参数不能是单纯的列表初始化形式 *list initialization (since C++11) - shared_ptr 在引用计数变为 0 时,自动销毁对象并释放内存,当把 shared_ptr 放在容器中时,不需要时应及时 erase 掉
- new 可以使用直接初始化,括号构造,和列表初始化来初始化
- new 可以分配 const 对象
const int* cip = new const int(42);
- 接受指针参数的智能指针的构造函数是 explicit 的,初始化时只能且必须使用直接初始化形式
- 用 unique_ptr 初始化 shared_ptr 时,unique_ptr 会被置空,shared_ptr 接管
- get 返回内置指针,用于兼容.get 到的指针不应删除对象,不应重新初始化别的智能指针,简单地说,一群 shared_ptr 应该起源于同一个 shared_ptr,这样他们的引用计数才不会乱
- shared_ptr 可以拆分
if (!p.unique())
p.reset(new string(*p));//如果有其他只能指针使用,则用 p 的值 reset p,保持 p 指向的值不变,同时与其他共享指针取消关系
*p += newVal;
- unique_ptr 也是只能使用直接初始化形式
- unique_ptr 不支持普通的拷贝或赋值操作
- unique_ptr 使用 release (返回指针并置空)和 reset 转交管理权
- 可以拷贝或赋值一个即将被销毁的 unique_ptr (函数返回值)
- wake_ptr 指向 shared_ptr 管理的对象,可用于解决循环引用造成无法释放的问题
- 使用 wake_ptr 访问对象时,必须调用 lock 并使用返回的 shared_ptr 来访问
- 动态数组的初始化
new int[10]//值未定义
new int[10]()//都是0
new int[10](10)//ERROR
new int10[]{0,1,2}//0.1,2,0,0.....(测试失败,后续值未正确初始化 gcc 4.8.1 mingw)
- 释放动态数组时,对象按逆序销毁
- unique_ptr 可以管理动态数组,
unique_ptr<int[]> up(new int[10]);
且可用 up[] 访问数组成员 - shared_ptr 管理动态数组时需自行创建并传入删除器,且没有[]可以使用,只能先 get 再解引用
shared_ptr<int> sp(new int[10], [](int *p) {delete[]p;});
for (size_t i = 0; i != 10; ++i)
cout << *(sp.get()+i);
- 为了减少分配内存的时间和防止内存泄露,可以使用 allocator 一次性分配足够内存,完毕后一次性释放