首页 > 后端开发 > C++ > 正文

C++unique_ptr实现移动语义技巧

P粉602998670
发布: 2025-09-13 08:20:01
原创
486人浏览过
std::unique_ptr通过删除拷贝构造和赋值函数防止资源拷贝,确保独占所有权;2. 实现移动构造和赋值函数以转移资源,原对象指针置空避免重复释放;3. 使用std::move将左值转为右值引用触发移动操作,完成资源安全转移。

c++unique_ptr实现移动语义技巧

在C++中,

std::unique_ptr
登录后复制
是一个独占式智能指针,它通过移动语义实现资源的转移,而不是拷贝。这背后的关键在于删除拷贝构造和拷贝赋值函数,并提供移动构造和移动赋值函数。掌握这些技巧有助于理解如何手动实现类似行为。

禁用拷贝操作

unique_ptr
登录后复制
不允许拷贝,因为所有权必须唯一。这是通过显式删除拷贝构造函数和拷贝赋值操作符实现的:

unique_ptr(const unique_ptr&) = delete;
unique_ptr& operator=(const unique_ptr&) = delete;
登录后复制

这样任何试图拷贝的行为都会在编译时报错,强制使用移动语义。

实现移动构造函数

移动构造函数接收一个右值引用,将资源从源对象“窃取”到新对象:

立即学习C++免费学习笔记(深入)”;

unique_ptr(unique_ptr&& other) noexcept {
    ptr_ = other.ptr_;        // 转移指针
    other.ptr_ = nullptr;     // 原对象置空,防止重复释放
}
登录后复制

关键点是把原指针置为

nullptr
登录后复制
,确保析构时不会重复释放内存。

ViiTor实时翻译
ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116
查看详情 ViiTor实时翻译

实现移动赋值操作符

移动赋值先清理当前资源,再执行与移动构造类似的操作:

unique_ptr& operator=(unique_ptr&& other) noexcept {
    if (this != &other) {           // 防止自赋值
        delete ptr_;                 // 释放当前资源
        ptr_ = other.ptr_;           // 接管新资源
        other.ptr_ = nullptr;        // 源对象置空
    }
    return *this;
}
登录后复制

注意释放旧资源是必要的,避免内存泄漏。

利用 std::move 显式触发移动

即使定义了移动操作,编译器也不会自动对具名变量调用移动。需要使用

std::move
登录后复制
将左值转为右值引用:

std::unique_ptr<int> p1 = std::make_unique<int>(42);
std::unique_ptr<int> p2 = std::move(p1); // p1 现在为空
登录后复制

std::move
登录后复制
不做实际移动,只是类型转换,真正的资源转移发生在移动构造或赋值中。

基本上就这些。掌握删除拷贝、实现移动构造与赋值、配合

std::move
登录后复制
使用,就能模拟
unique_ptr
登录后复制
的核心行为。不复杂但容易忽略细节,比如置空原指针和释放旧资源。

以上就是C++unique_ptr实现移动语义技巧的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号