news 2026/4/18 4:08:36

C++中不能复制只能移动的类型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++中不能复制只能移动的类型

在 C++ 中,不能复制(Non-Copyable)但可以移动(Movable)的类型通常是那些用于管理独占性资源的类。

这些类的设计目标是确保在任何给定时间,只有一个对象拥有该资源的所有权,从而防止资源被重复释放或发生混乱。

核心类型:独占性资源管理器

以下是 C++ 标准库中一些最重要、最常见的只能移动不能复制的类型:

1. 内存和资源所有权管理
类型托管的资源为什么不能复制?
std::unique_ptr独占性地管理堆上的动态内存。如果复制,两个指针将指向同一块内存。当其中一个析构时,内存会被释放,另一个指针将变成悬空指针(Dangling Pointer)。
std::fstream/std::ifstream/std::ofstream文件句柄(File Handle)。复制会导致两个对象试图管理同一个操作系统文件描述符,可能导致关闭两次或访问冲突。
std::thread操作系统线程的执行上下文。复制一个线程对象意味着创建两个对象来控制同一个系统线程的生命周期和同步点,这是逻辑上不允许的。
2. 并发和异步工具
类型托管的资源为什么不能复制?
std::mutex互斥锁的底层系统资源。如果复制,两个mutex对象将代表同一个锁,使得锁机制失效,无法保证互斥。
std::lock_guard/std::unique_lockstd::mutex的独占性锁定状态。它们是 RAII 锁,复制会导致两个对象试图同时管理同一个锁,破坏了独占性。
std::promise异步操作结果的共享状态复制将导致两个promise实例可以对同一个共享状态设置结果,这会破坏“单次设置”的规则。
std::packaged_task异步函数和其内部的std::promise它封装了std::promise,因此也必须保证独占所有权,确保任务只被执行一次。
std::future异步操作的获取句柄虽然有些future实现可以复制(如std::shared_future),但默认的std::future通常只能移动,因为它代表了对结果的独占性访问
3. C++20 同步原语
  • std::jthread:C++20 中的 RAII 线程,它自动join,继承了std::thread不可复制的特性。

  • std::counting_semaphore/std::binary_semaphore:信号量的底层资源是独占的。

总结和设计原则

当你设计一个 C++ 类时,如果这个类管理着一个无法安全共享的底层资源(如操作系统句柄、网络套接字、文件描述符、内存块的所有权),那么你应该:

  1. 禁用拷贝构造函数和拷贝赋值运算符(C++11/14/17 通常使用= delete)。

  2. 实现移动构造函数和移动赋值运算符(将底层资源指针/句柄从源对象转移到目标对象,并清空源对象)。

通过这种设计,C++ 编译器强制执行了资源所有权的转移,保证了资源的生命周期安全,这是现代 C++ 编程中一个重要的设计范式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 3:27:15

企业质量管理数字化解决方案:构建全流程闭环管控体系

在市场竞争加剧与合规要求升级的背景下,质量管理已从传统的“事后检验”升级为贯穿企业价值链的“全流程管控”。企业亟需一套覆盖“策划-执行-监测-改进”的系统化方案,破解流程碎片化、数据孤岛、响应滞后等痛点,实现质量与效率的双重提升。…

作者头像 李华
网站建设 2026/4/18 3:26:41

9 个降AI率工具,研究生必备避坑指南

9 个降AI率工具,研究生必备避坑指南 AI降重工具:论文写作的“隐形助手” 在研究生阶段,论文写作不仅是学术能力的体现,更是一场与时间、技术、规范的较量。随着AI技术的广泛应用,许多学生发现自己的论文中出现了明显的…

作者头像 李华
网站建设 2026/4/17 12:26:44

基础搜索模块 Cordova 与 OpenHarmony 混合开发实战

📌 概述 基础搜索模块提供了快速搜索喝茶记录的功能。该模块集成了 Cordova 框架与 OpenHarmony 原生能力,实现了高效的全文搜索和实时搜索结果展示。用户可以通过输入关键词快速查找相关的喝茶记录。模块支持按茶叶类型、产地和备注信息搜索&#xff0c…

作者头像 李华
网站建设 2026/4/18 3:27:23

深入解析Adobe AEM中的标签管理

在Adobe Experience Manager(AEM)中,标签(Tag)管理是内容管理的重要一环。通过合理地使用标签,可以显著提高内容的可发现性和管理效率。今天,我们将探讨如何在AEM的后台中获取和管理这些标签,结合具体的代码实例来展示这一过程。 什么是AEM中的标签? 在AEM中,标签是…

作者头像 李华
网站建设 2026/4/18 3:28:09

16.华为OD机试满分题解:对称美学(Java 2024 E卷)| 递归与迭代双解

16.华为OD机试满分题解:对称美学(Java 2024 E卷)| 递归与迭代双解 🔥 VIP专属:本文深度解析华为OD机试高频考点,提供两种优化解法,附详细注释和解题思路。掌握此技巧,轻松应对字符串递归类题型! 📋 题目概述 问题描述 给定对称字符串的生成规则: 第1个字符串为 …

作者头像 李华
网站建设 2026/4/18 3:27:24

LobeChat产品研发优先级建议

LobeChat产品研发优先级建议 在大语言模型能力飞速演进的今天,一个有趣的现象逐渐浮现:底层AI越来越聪明,但用户真正“摸得着”的体验却常常跟不上节奏。我们见过太多强大的模型被锁在API文档里,或是藏在一个简陋的输入框背后——…

作者头像 李华