当前位置:

首页 > 编程开发 > 移动语义影响智能指针,std::move转移示例解析

移动语义影响智能指针,std::move转移示例解析

移动语义通过std::move实现智能指针所有权转移,避免拷贝开销;unique_ptr因独占所有权仅支持移动,shared_ptr移动时无需增加引用计数更高效,函数传参时使用std::move可将资源所有权安全移交,提升性能。

移动语义通过std::move实现智能指针所有权转移,避免拷贝开销;unique_ptr因独占所有权仅支持移动,shared_ptr移动时无需增加引用计数更高效,函数传参时使用std::move可将资源所有权安全移交,提升性能。

移动语义对智能指针影响 std move转移所有权示例

移动语义让C++中的资源管理更高效,尤其在智能指针中体现明显。通过std::move,可以将一个智能指针的所有权转移给另一个,避免不必要的拷贝和资源浪费。下面用std::unique_ptr和std::shared_ptr来说明移动语义的影响和使用方式。

std::unique_ptr与所有权转移

std::unique_ptr是独占式智能指针,同一时间只能有一个unique_ptr拥有对象。它不支持拷贝,但支持移动。使用std::move可以将所有权从一个unique_ptr转移到另一个。

示例:

#include 
#include 

struct MyClass {
    int value;
    MyClass(int v) : value(v) { std::cout << "构造: " << value << "\n"; }
    ~MyClass() { std::cout << "析构: " << value << "\n"; }
};

int main() {
    std::unique_ptr ptr1 = std::make_unique(42);
    std::cout << "ptr1 value: " << ptr1->value << "\n";

    // 使用std::move转移所有权
    std::unique_ptr ptr2 = std::move(ptr1);

    // 此时ptr1为空,ptr2持有对象
    if (ptr1 == nullptr) {
        std::cout << "ptr1 已为空\n";
    }
    std::cout << "ptr2 value: " << ptr2->value << "\n";

    return 0;
}

输出:

构造: 42
ptr1 value: 42
ptr1 已为空
ptr2 value: 42
析构: 42

说明:ptr1在std::move后不再持有对象,析构时不会释放资源,由ptr2负责释放。

std::shared_ptr也支持移动语义

虽然shared_ptr允许多个指针共享所有权,但它也支持移动语义。移动一个shared_ptr比拷贝更高效,因为不需要原子操作递增引用计数。

示例:

#include 
#include 

int main() {
    std::shared_ptr sp1 = std::make_shared(100);
    std::cout << "sp1 use_count: " << sp1.use_count() << "\n";

    // 移动sp1到sp2
    std::shared_ptr sp2 = std::move(sp1);

    std::cout << "移动后 sp1 use_count: " << (sp1 ? "非空" : "空") << "\n";
    std::cout << "sp2 use_count: " << sp2.use_count() << ", value: " << *sp2 << "\n";

    return 0;
}

输出:

sp1 use_count: 1
移动后 sp1 use_count: 空
sp2 use_count: 1, value: 100

说明:移动后sp1为空,引用计数不变,sp2接管资源。

函数传参中的移动语义

移动语义常用于函数间传递智能指针,避免拷贝开销。

示例:

void process_ptr(std::unique_ptr ptr) {
    std::cout << "处理对象: " << ptr->value << "\n";
} // ptr在此处析构

int main() {
    auto p = std::make_unique(99);
    process_ptr(std::move(p)); // 所有权转移给函数

    if (!p) {
        std::cout << "p 已移交\n";
    }
    return 0;
}

输出:

构造: 99
处理对象: 99
析构: 99
p 已移交

说明:main中的p通过std::move将所有权交给函数参数,函数结束时自动清理。

基本上就这些。移动语义配合智能指针,让资源管理既安全又高效。unique_ptr靠移动实现所有权转移,shared_ptr移动能减少计数操作开销。std::move是触发移动的关键,用起来简单但效果显著。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
蛙蛙写作应用商店搜不到该App如何下载
蛙蛙写作应用商店搜不到该App如何下载

在应用商店搜不到蛙蛙写作?本文详解iOS搜索核对方法、Android官方入口确认步骤及电脑浏览器网页版(wawawriter.com)直接使用技巧,助你安全获取正版创作工具。

termius中文安装教程及语言设置方法
termius中文安装教程及语言设置方法

详解Termius官方客户端的下载安装步骤,演示如何在设置中查找并切换中文界面(如版本支持)。涵盖主机添加、SSH密钥管理及SFTP文件传输的基础操作,帮助用户安全高效地管理远程服务器。

office打开看不到内容怎么设置才能恢复正常显示
office打开看不到内容怎么设置才能恢复正常显示

遇到Office文档打开后一片空白或内容不全?先别急着重装。本文教你通过新建文档排查问题,调整Word/Excel/PPT的视图、缩放、隐藏行列及对象可见性设置,并处理文件权限与损坏问题,快速恢复正常显示。

microsoft浏览器怎么移除主页网址
microsoft浏览器怎么移除主页网址

点击 Microsoft Edge 主页按钮或启动浏览器时总是跳转到不想要的网址?本文详解如何在设置中将主页按钮改为新标签页,以及删除启动时自动打开的特定页面,帮助恢复干净的浏览入口。

blender为什么添加动画后渲染只有看第一帧
blender为什么添加动画后渲染只有看第一帧

解决Blender渲染动画时画面静止在第一帧的问题。检查关键帧是否生效、时间轴Start/End范围、Render Animation与Render Image的区别,以及摄像机和对象渲染可见性设置,快速恢复动画输出。

blender怎么做橡胶模型材质效果制作教程
blender怎么做橡胶模型材质效果制作教程

学习如何在Blender中制作真实的橡胶模型材质。从模型倒角准备到Principled BSDF参数设置,再到使用Noise Texture和Bump节点添加微表面细节,逐步实现柔和、自然的橡胶质感,避免塑料感。

scapple内容导出工具使用方法与导出教程
scapple内容导出工具使用方法与导出教程

学习如何将 Scapple 画布导出为图片、PDF 或文本文件。本文详解导出前的画布整理技巧、不同格式的适用场景及常见问题排查,助你高效交付思维导图成果。

blender 导入模型后看不见的解决教程
blender 导入模型后看不见的解决教程

Blender导入模型后视图中找不到对象?本文详解如何通过Outliner选中聚焦、检查集合隐藏状态、退出本地视图、调整视图裁剪范围以及验证网格法线,快速解决模型不可见问题。

office无法打开wps做的word解决方法教程
office无法打开wps做的word解决方法教程

WPS保存的Word文档在Microsoft Office中无法打开?本文详解如何检查文件格式、正确另存为.docx、使用“打开并修复”功能以及排除权限拦截,帮助你快速恢复文档访问。

coreldraw+x8中文设置方法详细操作教程
coreldraw+x8中文设置方法详细操作教程

CorelDRAW X8安装后界面为英文?本文提供详细的中文设置教程:从打开选项窗口、定位全局常规设置,到选择简体中文并重启验证。同时解答语言切换后文字显示异常等常见误区,助您快速恢复熟悉的中文操作环境。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
IntelliJ IDEA macOS版
IntelliJ IDEA macOS版
Mac

IntelliJ IDEA 是 JetBrains 推出的专业集成开发环境,重点服务于 Java、Kotlin 与 JVM 项目开发。软件集成代码补全、静态检查、重构、调试、测试、版本控制及构建工具,并可借助插件扩展语言和框架支持。

PyCharm macOS版
PyCharm macOS版
Mac

JetBrains PyCharm 是面向 Python 开发者的集成开发环境,提供智能补全、代码检查、重构、调试、测试、版本控制及虚拟环境管理功能。Mac 版兼容 Intel 与 Apple 芯片,核心功能可免费使用。

WebStorm macOS版
WebStorm macOS版
Mac

JetBrains WebStorm 是面向 JavaScript、TypeScript 和现代 Web 技术的专业集成开发环境,可智能理解项目结构,提供代码补全、重构、错误检查、运行调试、测试及 Git 工具。

WINDOWS 更多
IntelliJ IDEA Windows版
IntelliJ IDEA Windows版
Windows

JetBrains IntelliJ IDEA 是以 Java、Kotlin 和 JVM 项目为核心的专业集成开发环境,提供智能补全、代码检查、安全重构、调试、测试、版本控制及构建工具集成。统一发行版的核心功能可免费用于商业和非商业项目,

PhpStorm Windows版
PhpStorm Windows版
Windows

PhpStorm 是 JetBrains 面向 PHP 与现代 Web 开发打造的专业集成开发环境,提供代码补全、静态检查、重构、调试、测试、数据库、版本控制及前端语言支持。Windows 用户可直接下载安装程序,

PyCharm Windows版
PyCharm Windows版
Windows

PyCharm 是 JetBrains 推出的 Python 集成开发环境,提供智能代码补全、错误检查、重构、调试、测试、Git、终端及 Jupyter Notebook 支持。统一版安装后可体验 30 天 Pro 功能,