unique_ptr提供的语义是独占资源,支持下列操作:
| 函数 | 作用 |
|---|---|
| unique_ptr up | 默认构造函数,up为空 |
| unique_ptr up(ptr) | 构造函数,指定资源 |
| unique_ptr up(ptr, del) | 构造函数,指定资源和deleter |
| unique_ptr up(move(up2)) | 移动语义构造函数,up2是一个unique_ptr对象,up2的资源所有权转移到up |
| unique_ptr up(move(ap)) | 移动语义构造函数,ap是一个auto_ptr对象 |
| up = move(up2) | 移动语义赋值操作符,up原有资源被释放,up2的资源所有权转移到up |
| up = nullptr | 释放资源,up变为空 |
| up1.swap(up2) | 交换 pointer 和 deleter |
| swap(up1, up2) | 交换 pointer 和 deleter |
| up.reset() | 释放资源,up变为空 |
| up.reset(ptr) | 释放原有资源,引用新的资源 |
| up.release() | 放弃资源所有权,并返回资源对象 |
| up.get() | 返回 pointer |
| *up | 针对非数组资源,返回资源对象 |
| up-> | 针对非数组资源,访问资源对象的成员 |
| up[] | 针对数组资源,提供随机读写 |
| if (up) | 判断 up 是否为空 |
| ==、!=、<、<=、>、>= | 比较pointer |
| up.get_deleter() | 返回deleter |
独占语义
unique_ptr提供独占语义,但这需要使用者提供保证,代码中不能出现多个unique_ptr同时引用同一个资源:
string *str = new string("unique_ptr");
unique_ptr<string> up1(str);
unique_ptr<string> up2(str);
上面的代码会引起运行期错误。所以,unique_ptr没有提供普通的拷贝构造函数和赋值操作符,只提供了移动语义的拷贝构造函数和赋值操作符。
针对数组的偏特化
unique_ptr有一个针对数组的偏特化,该偏特化提供了针对数组的下标操作符[],相对的删除了 * 和 -> 操作符。另外,该版本在释放资源时对指针执行 delete[]。所以,可以不用提供特定的deleter:
unique_ptr<string[]> up(new string[10]{"hello"});
cout << up[0] << endl;
博客介绍了unique_ptr的相关特性。它提供独占资源的语义,不允许多个unique_ptr同时引用同一资源,因此没有普通拷贝构造函数和赋值操作符,只有移动语义的相关操作符。此外,unique_ptr有针对数组的偏特化,提供下标操作符,删除 * 和 -> 操作符,释放资源时用 delete[] 。
3万+

被折叠的 条评论
为什么被折叠?



