2026/1/10 14:19:24
网站建设
项目流程
建设网站方案,企业建网站一般要多少钱,网站建设 网站,旅行社网站 模板在 C 中#xff0c;不能复制#xff08;Non-Copyable#xff09;但可以移动#xff08;Movable#xff09; 的类型通常是那些用于管理独占性资源的类。这些类的设计目标是确保在任何给定时间#xff0c;只有一个对象拥有该资源的所有权#xff0c;从而防止资源被重复释放…在 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. C20 同步原语std::jthreadC20 中的 RAII 线程它自动join继承了std::thread不可复制的特性。std::counting_semaphore/std::binary_semaphore信号量的底层资源是独占的。总结和设计原则当你设计一个 C 类时如果这个类管理着一个无法安全共享的底层资源如操作系统句柄、网络套接字、文件描述符、内存块的所有权那么你应该禁用拷贝构造函数和拷贝赋值运算符C11/14/17 通常使用 delete。实现移动构造函数和移动赋值运算符将底层资源指针/句柄从源对象转移到目标对象并清空源对象。通过这种设计C 编译器强制执行了资源所有权的转移保证了资源的生命周期安全这是现代 C 编程中一个重要的设计范式。