介绍:
- unique_ptr拥有他所指向的对象
- 某个时刻只能有一个unique_ptr指向一个给定的对象
- 当unique_ptr被销毁时,它所指向的对象也被销毁
- 定义一个unique_ptr时,需要将其绑定到一个new返回的指针上
- unique_ptr不支持普通的拷贝和赋值操作,但可以通过release()和reset()方法将指针的所有权转移给另一个unique_ptr
1. unique_ptr操作
| 操作 | 说明 |
|---|---|
| unique_ptr< T> u1 | 创建一个空的unique_ptr,可以指向类型为T的对象 u1使用delete方式释放内存 |
| unique_ptr< T, D> u2 | 创建一个空的unique_ptr,可以指向类型为T的对象 u2使用一个类型为D的可调用对象释放它的指针 |
| unique_ptr< T, D> u3(d) | 创建一个空的unique_ptr,可以指向类型为T的对象 u2使用一个类型为D的可调用对象d代替delete |
| u.release() | u放弃对指针的控制权,返回指针,并将u置空 |
| u.reset() | 释放u指向的对象,并将u置为空 |
| u.reset(q) | 释放u原来指向的对象,令u指向这个q |
2. release()和reset()操作
我们不能直接拷贝或赋值unique_ptr,因为它是独占对象的,但是我们可以通过release()和reset()操作将指针的所有权转移给另一个unique_ptr。
如下面的方式是错误的操作
unique_ptr<string> p1(new string("dfs")); // 定义一个unique_ptr
unique_ptr<string> p2(p1); // 错误,不能拷贝
unique_ptr<string> p3;
p3 = p1; // 错误,不能赋值
通过release()和reset()方式转移所有权:
- release()会返回指向的指针,但不会释放内存
- reset()会释放内存
// 将所有权从p1转移给p2
unique_ptr<string> p2(p1.release()); // p1.release()会将p1置空,并返回所指向的指针
unique_ptr<string> p3(new string("dfseg"));
// 将所有权从p3转移给p2
p2.reset(p3.release()); // p3置空,并返回指针
// p2释放原来指向的对象,并重新指向p3的指针
3. 特殊的拷贝
由于unique_ptr独占对象,无法直接对其进行拷贝,但是有一种情况除外,就是在函数中返回局部unique_ptr对象。
unique_ptr<string> clone(string s) {
return unique_ptr<string>(new string(s));
}
返回一个局部对象的拷贝:
unique_ptr<string> clone(string s) {
unique_ptr<string> us(new string(s));
//其他操作
return us;
}
本文详细介绍了C++中的智能指针unique_ptr,包括其独占对象的特性,以及如何通过release()和reset()方法进行所有权转移。unique_ptr不支持普通拷贝和赋值,但在特定情况下,如函数返回局部unique_ptr对象时,可以实现所有权的特殊转移。
3万+

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



