智能指针有三种

  • shard_ptr
  • unqiue_ptr
  • weak_ptr

! auto_ptr 在 C++ 11 后取消(unqiue_ptr代替)

1. 循环使用 shared ptr 会导致内存泄漏

2. 连个指向同一个内存的unqiue ptr会导致编译器报错

unique_ptr实现独占式拥有或严格拥有概念,保证同一时间内只有一个智能指针可以指向该对象。它对于避免资源泄露(例如“以new创建对象后因为发生异常而忘记调用delete”)特别有用。

  1. unique_ptr<string> p3 (new string ("auto")); //#4
  2. unique_ptr<string> p4 //#5
  3. p4 = p3;//此时会报错!! (编译器认为非法)

当程序试图将一个 unique_ptr 赋值给另一个时,如果源 unique_ptr 是个临时右值,编译器允许这么做;如果源 unique_ptr 将存在一段时间,编译器将禁止这么做,比如

  1. unique_ptr<string> pu1(new string ("hello world"));
  2. unique_ptr<string> pu2;
  3. pu2 = pu1; // #1 not allowed
  4. unique_ptr<string> pu3;
  5. pu3 = unique_ptr<string>(new string ("You")); // #2 allowed