unique_ptr 拷贝的方法

本文详细介绍了如何通过解引用操作在std::unique_ptr中实现深拷贝,包括copyconstruct、safecopyconstruct、copyassignment和safecopyassignment的实例,并引用了谷歌TensorFlow和微软Terminal的相关示例。

unique_ptr 拷贝的方法

std::unique_ptr Deep Copy

虽然 std::unique_ptr 删除了 copy constructor 和 copy assignment operator ,但其实我们可以借助解引用操作变通地对 std::unique_ptr 进行拷贝。

deep copy 示例如下:

std::unique_ptr<std::string> up1(std::make_unique<std::string>("Good morning"));

// copy construct!
std::unique_ptr<std::string> up2(std::make_unique<std::string>(*up1));
// safe copy construct!
std::unique_ptr<std::string> up3(up1 ? std::make_unique<std::string>(*up1) : nullptr);
// copy assignment!
up2 = std::make_unique<std::string>(*up1);
// safe copy assignment!
up3 = up1 ? std::make_unique<std::string>(*up1) : nullptr;

其它的例证:

<think>好的,我需要回答用户关于C++unique_ptr的成员函数及其用法的问题。首先,我应该回忆unique_ptr的基本概念,它是一个独占所有权的智能指针,确保同一时间只有一个unique_ptr指向某个对象,当unique_ptr被销毁时,其所管理的对象也会被自动释放。接下来,我需要整理它的成员函数,参考用户提供的引用,特别是引用2、3、4中的内容。 首先,构造函数和析构函数。用户可能需要知道如何创建unique_ptr,比如使用make_unique或者在构造时直接传递指针。根据引用3,unique_ptr不能拷贝,但可以移动,所以移动构造函数和移动赋值运算符是存在的。 然后是get()方法,返回原始指针,这在需要与旧代码交互时有用。release()方法会释放所有权,返回指针并将unique_ptr置为空,这在转移所有权时很重要。reset()方法用于重置管理的对象,可能释放原有对象并接管新指针。 检查是否为空可以用operator bool,而解引用操作符*和->则是访问对象成员的基础。还有针对数组特化的operator[],这在C++17之后支持。 此外,交换swap()方法用于交换两个unique_ptr的内容。用户可能还关心如何正确转移所有权,比如使用std::move,这在移动语义中很关键。需要注意,unique_ptr不能拷贝,只能移动,这一点在引用3中被特别提到。 需要确保每个成员函数的描述准确,并附上示例代码,帮助用户理解。同时,引用相关的参考资料,比如引用2和引用3中的内容,来增强回答的可信度。最后,生成相关问题,引导用户进一步学习。</think>### C++ unique_ptr成员函数列表及用法说明 `unique_ptr`是C++11引入的智能指针,用于管理动态分配对象的独占所有权[^2][^4]。以下为常用成员函数及其作用: --- #### **核心成员函数** 1. **构造函数** - `unique_ptr<T> ptr(new T());`:构造时接管原始指针所有权[^2]。 - `unique_ptr<T[]> ptr(new T[n]);`:管理动态数组(需显式指定数组类型)。 ```cpp std::unique_ptr<int> ptr1(new int(42)); // 管理单个int std::unique_ptr<int[]> arr(new int[5]); // 管理int数组 ``` 2. **析构函数** - 自动释放管理的对象或数组,无需手动`delete`。 3. **移动语义** - `unique_ptr(unique_ptr&& other)`:通过移动构造函数转移所有权[^3]。 - `operator=(unique_ptr&& rhs)`:通过移动赋值转移所有权。 ```cpp std::unique_ptr<int> ptr2 = std::move(ptr1); // ptr1所有权转移至ptr2 ``` --- #### **关键操作函数** 4. **`get()`** - 返回原始指针,不释放所有权。适用于需要原始指针的API。 ```cpp int* raw_ptr = ptr1.get(); ``` 5. **`release()`** - 释放所有权,返回原始指针并将`unique_ptr`置空。 ```cpp int* released_ptr = ptr1.release(); // ptr1变为nullptr ``` 6. **`reset()`** - 释放当前对象并接管新指针(若参数为空则仅释放当前对象)。 ```cpp ptr1.reset(new int(100)); // 释放旧int,管理新int ptr1.reset(); // 释放对象,ptr1置空 ``` 7. **`swap(unique_ptr& other)`** - 交换两个`unique_ptr`管理的对象[^4]。 ```cpp ptr1.swap(ptr2); // ptr1和ptr2管理的对象互换 ``` --- #### **运算符重载** 8. **`operator*` 和 `operator->`** - 访问托管对象的成员(类似原始指针)。 ```cpp std::unique_ptr<Test> test(new Test()); test->do_something(); // 调用成员函数 (*test).value = 10; // 访问成员变量 ``` 9. **`operator bool`** - 检查是否为空(返回`true`表示有托管对象)。 ```cpp if (ptr1) { /* ptr1非空时执行 */ } ``` 10. **`operator[]`(仅限数组类型)** - 访问托管数组的元素(C++17起支持)。 ```cpp std::unique_ptr<int[]> arr(new int[3]); arr[0] = 10; // 访问第一个元素 ``` --- #### **注意事项** - **禁止拷贝**:`unique_ptr`不可复制,只能通过移动转移所有权[^3]。 - **自定义删除器**:可通过模板参数指定自定义释放逻辑(如文件句柄)。 - **与`shared_ptr`转换**:使用`std::move`可将`unique_ptr`转移给`shared_ptr`。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值