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;