Cpp Tutorials-02b-智能指针

C++11 中推出了三种智能指针,unique_ptr、shared_ptr 和 weak_ptr,同时也将 auto_ptr 置为废弃 (deprecated)。

unique_ptr

它是一个独占型的智能指针,不允许其他的智能指针共享其内部的指针,更像原生的指针(但更为安全,能够自己释放内存)。不允许赋值和拷贝操作,只能够移动

std::unique_ptr<int> ptr1(new int(0)); 
std::unique_ptr<int> ptr2 = ptr1; // 错误,不能复制 std::unique_ptr<int> ptr3 = std::move(ptr1); // 可以移动

在 C++14 中,对于 std::unique_ptr 引入了 std::make_unique 方法进行初始化:

std::unique_ptr<std::string> ptr = std::make_unique<std::string>("make_unique init!");

智能指针 unique_ptr 的实现最简单,参考 「RAII(资源获取即初始化)」,
因为 C++ 的 zero cost abstraction 的特点,unique_ptr 在默认情况下和裸指针的大小是一样的。
所以内存上没有任何的额外消耗,性能也是最优的

shared_ptr

shared_ptr 智能指针,一个对象可以被多个 shared_ptr 管理:

shared_ptr<A> sp1(new A(2)); //A(2)由sp1托管,
shared_ptr<A> sp2(sp1); //A(2)同时交由sp2托管
shared_ptr<A> sp3;
sp3 = sp2; //A(2)同时交由sp3托管

A * p = sp3.get(); // get返回托管的指针,p 指向 A(2)

sp1.reset(new A(3)); // reset导致托管新的指针, 此时sp1托管A(3)

shared_ptr 的实现:
shared_ptr 对所管理的对象进行了引用计数,当新增一个 shared_ptr 对该对象进行管理时,就将该对象的引用计数加一;减少一个 shared_ptr 对该对象进行管理时,就将该对象的引用计数减一,如果该对象的引用计数为0的时候,说明没有任何指针对其管理,才调用 delete 释放其所占的内存。