C++11新特性 2 智能指针 unique_ptr

394 阅读1分钟

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_sharedC++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