Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save wen-long/08a97e431c823ea2de62 to your computer and use it in GitHub Desktop.
Save wen-long/08a97e431c823ea2de62 to your computer and use it in GitHub Desktop.

###C++ Primer第5版 学习笔记

####第十二章

  1. 定义 shared_ptr 时常使用 make_shared 函数和 auto,如auto p = make_shared<vector<string>>(5, "aaa");,这种带初始化的,括号中的参数不能是单纯的列表初始化形式 *list initialization (since C++11)
  2. shared_ptr 在引用计数变为 0 时,自动销毁对象并释放内存,当把 shared_ptr 放在容器中时,不需要时应及时 erase 掉
  3. new 可以使用直接初始化,括号构造,和列表初始化来初始化
  4. new 可以分配 const 对象const int* cip = new const int(42);
  5. 接受指针参数的智能指针的构造函数是 explicit 的,初始化时只能且必须使用直接初始化形式
  6. 用 unique_ptr 初始化 shared_ptr 时,unique_ptr 会被置空,shared_ptr 接管
  7. get 返回内置指针,用于兼容.get 到的指针不应删除对象,不应重新初始化别的智能指针,简单地说,一群 shared_ptr 应该起源于同一个 shared_ptr,这样他们的引用计数才不会乱
  8. shared_ptr 可以拆分
if (!p.unique())
   p.reset(new string(*p));//如果有其他只能指针使用,则用 p 的值 reset p,保持 p 指向的值不变,同时与其他共享指针取消关系
*p += newVal;
  1. unique_ptr 也是只能使用直接初始化形式
  2. unique_ptr 不支持普通的拷贝或赋值操作
  3. unique_ptr 使用 release (返回指针并置空)和 reset 转交管理权
  4. 可以拷贝或赋值一个即将被销毁的 unique_ptr (函数返回值)
  5. wake_ptr 指向 shared_ptr 管理的对象,可用于解决循环引用造成无法释放的问题
  6. 使用 wake_ptr 访问对象时,必须调用 lock 并使用返回的 shared_ptr 来访问
  7. 动态数组的初始化
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)
  1. 释放动态数组时,对象按逆序销毁
  2. unique_ptr 可以管理动态数组,unique_ptr<int[]> up(new int[10]);且可用 up[] 访问数组成员
  3. 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);
  1. 为了减少分配内存的时间和防止内存泄露,可以使用 allocator 一次性分配足够内存,完毕后一次性释放
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment