unique_ptr 独占的智能指针
std::unqiue_ptr是一个独占型的智能指针, 它不允许其他的智能指针共享其内部的指针, 不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr
错误的使用方法
std::unique_ptr<T> my_ptr(new T);
std::unique_ptr<T> my_other_ptr = my_ptr; // 报错
unique_ptr不允许复制, 但可以通过函数返回给其他的unique_ptr
std::unique_ptr<T> my_ptr(new T);
还可以通过std::move来转移到其他的unique_ptr, 这样它本身就不再拥有原来指针的所有权
std::unique_ptr<T> my_ptr(new T);
std::unique_ptr<T> my_other_ptr = std::move(my_ptr);
std::make_shared是C++11的一部分, 但是std::make_unqiue不是, 是C++14里加入标准库的
一些用法上的注意
先看代码
with make func
auto upw1(std::make_unique<Widget>()); // with make func
without make func
std::unique_ptr<Widget> upw2(new Widget); // without make func
使用new的这个重复了被创建对象的键入, 但是下面这个版本是没有的.
重复违背了软件设计的重要原则, 代码的重复会引起编译次数增加, 导致目标代码的膨胀
和 shared_ptr的一些区别
除了独占性这个特性
unique_ptr可以指向一个数组
std::unique<int []> ptr(new int[10]);
ptr[9] = 9;
这是可以的
std::make_shared<int[]> ptr2(new int[10]); // 会报错是不合法的
这个是会引发编译器报错的
unique_ptr指定删除器和shared_ptr有区别
std::shared_ptr ptr3(new int(1), [](int *p){delete p;}); // 正确
std::unique_ptr ptr4(new int(1), [](int *p){delete p;}); // 错误
unqiue_ptr需要确定删除器的类型, 所以不能像shared_ptr那样直接指定删除器
std::unique_ptr<int, void(*)(int *)> ptr5(new int(1), [](int *p){ delete p; });
使用场景
如果希望只有一个智能指针管理资源或者管理数组就用unique_ptr, 如果希望多个智能指针管理同一个资源就用shared_ptr