news 2026/10/21 6:13:39

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_lock对std::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/10/21 8:03:17

Java NIO 深度解析:从核心组件到高并发实战

在 Java IO 编程领域,传统的 BIO(Blocking IO)模型因 “一连接一线程” 的特性,在高并发场景下存在严重的性能瓶颈。而 Java NIO(New Input/Output,JDK 1.4 引入)通过非阻塞 IO、多路复用等核心…

作者头像 李华
网站建设 2026/10/20 21:56:56

计算机Java毕设实战-基于javaweb的自习室图书馆座位预约管理系统基于javaweb的自习室座位管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/10/21 17:00:50

芒格的“反向工程“思维在量子密码破解防御中的应用

芒格的"反向工程"思维在量子密码破解防御中的应用关键词:芒格反向工程思维、量子密码、破解防御、思维应用、量子安全摘要:本文深入探讨了芒格的“反向工程”思维在量子密码破解防御领域的应用。首先介绍了背景信息,包括研究目的、…

作者头像 李华
网站建设 2026/10/21 8:43:40

Keycloak动态令牌增强与条件参数处理

引言 在现代的网络服务架构中,身份验证和授权的安全性和灵活性至关重要。Keycloak作为一款开源的身份和访问管理解决方案,广泛应用于各种场景。然而,当需要在令牌中动态添加额外信息时,我们常常面临一些挑战。本文将探讨如何在Keycloak中通过自定义认证器和令牌映射器来实…

作者头像 李华
网站建设 2026/10/21 1:44:15

JavaScript数组方法的实战应用

引言 在JavaScript编程中,处理数组是日常任务的一部分。今天我们将探讨一个常见的需求:如何在数组中查找特定的值或条件。我们将通过一个实际的例子来学习如何使用JavaScript的数组方法来解决这个问题。 背景 假设你正在开发一个在线调查问卷系统,用户需要回答一系列“是…

作者头像 李华
网站建设 2026/10/21 13:43:39

硬件面试话术锦囊问题-深度解析与职业发展

硬件面试话术锦囊问题-深度解析与职业发展 在电子技术飞速发展的今天,硬件工程师是推动创新的重要力量。对于希望在这一领域脱颖而出的工程师来说,面试不仅是展示技术能力的舞台,也是体现职业素养和规划的关键时刻。 本文围绕硬件工程师面试中的常见核心问题,深入分析其意…

作者头像 李华