C++之 delete删除拷贝构造函数和拷贝赋值运算符

在 C++ 中,删除拷贝构造函数和拷贝赋值运算符是一种常见的方法,用于防止对象的拷贝和赋值。这在某些情况下是必要的,例如当类管理资源(如线程、文件句柄或网络连接)时,以确保资源的唯一性和避免潜在的资源泄漏或多重释放。

以下是对代码的解释:

CThreadPool(const CThreadPool &) = delete;
CThreadPool &operator=(const CThreadPool &) = delete;

拷贝构造函数和拷贝赋值运算符

  1. 拷贝构造函数:用于通过已有对象来创建新对象。例如:

  • CThreadPool pool1;
    CThreadPool pool2 = pool1; // 调用拷贝构造函数
    
  • 拷贝赋值运算符:用于将一个对象赋值给另一个已有的对象。例如:

  1. CThreadPool pool1;
    CThreadPool pool2;
    pool2 = pool1; // 调用拷贝赋值运算符
    

delete 关键字

在 C++11 及之后的版本中,可以使用 delete 关键字显式地禁止这些默认操作。这样做会使得编译器在检测到这些操作时生成错误,从而防止使用这些操作。

在类中删除拷贝构造函数和拷贝赋值运算符

对于 CThreadPool 类,删除拷贝构造函数和拷贝赋值运算符意味着你不希望该类的对象被复制或赋值。这通常是因为这个类管理的资源不应该被多个实例共享。典型的例子包括线程池、文件句柄、数据库连接等。

为什么要删除它们?

  1. 防止资源共享问题:线程池对象通常包含线程、任务队列等资源,这些资源不适合被多个对象共享或重复管理。
  2. 防止潜在的错误:允许对象的拷贝或赋值可能会导致资源管理上的复杂问题,比如双重释放、竞争条件等。
  3. 明确设计意图:通过删除这些操作,明确表明该类的对象是不可复制的,这有助于降低误用的风险。

示例代码

下面是一个包含删除拷贝构造函数和拷贝赋值运算符的 CThreadPool 类的示例:

#include <iostream>
#include <thread>
#include <vector>class CThreadPool {
public:// 构造函数CThreadPool(int numThreads) {// 启动指定数量的线程for (int i = 0; i < numThreads; ++i) {threads.emplace_back([this]() { this->workerThread(); });}}// 析构函数~CThreadPool() {// 加入所有线程for (std::thread &thread : threads) {if (thread.joinable()) {thread.join();}}}// 删除拷贝构造函数CThreadPool(const CThreadPool &) = delete;// 删除拷贝赋值运算符CThreadPool &operator=(const CThreadPool &) = delete;private:std::vector<std::thread> threads;void workerThread() {// 线程执行的任务std::cout << "Thread started" << std::endl;}
};int main() {CThreadPool pool(4);// 以下操作会导致编译错误,因为拷贝构造函数和拷贝赋值运算符已被删除// CThreadPool copyPool = pool;// CThreadPool anotherPool(2);// anotherPool = pool;return 0;
}

在这个示例中:

  • CThreadPool 的拷贝构造函数和拷贝赋值运算符被删除。
  • 如果试图复制或赋值 CThreadPool 对象,将会导致编译错误,从而防止错误的资源管理行为。

这样设计可以确保线程池的唯一性和资源管理的正确性,同时明确了该类对象不可复制的设计意图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/28329.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法人生(22):从“生成对抗网络”看“逆商提升”

​ 在图像生成与编辑、音频合成、视频生成领域里&#xff0c;有一个非常重要的深度学习方法——生成对抗网络&#xff08;简称GANs&#xff09;&#xff0c;它是由两个神经网络组成的模型&#xff0c;分别为生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discr…

【Linux】I/O多路复用

文章目录 I/O多路复用select()select()缺点 poll()poll()缺点 epoll()LT(水平触发模式)ET(边缘触发模式)具体函数 I/O多路复用 多进程和多线程实现并发会消耗大量的资源&#xff0c;主进程/线程用于监听和接受连接&#xff0c;再创建多个子进程/子线程来完成与连接的各个客户端…

采煤vr事故灾害应急模拟救援训练降低生命财产损失

在化工工地&#xff0c;设备繁多、环境复杂&#xff0c;潜藏着众多安全隐患&#xff0c;稍有不慎便可能引发安全事故。为了保障工地的安全&#xff0c;我们急需一套全面、高效的安全管理解决方案。web3d开发公司深圳华锐视点研发的工地安全3D模拟仿真隐患排查系统&#xff0c;正…

可以用来制作硬模空心耳机壳的胶粘剂有哪些种类?

可以用来制作硬模空心耳机壳的胶粘剂有哪些种类&#xff1f; 制作耳机壳的胶粘剂有很多种类&#xff0c;常见的有环氧树脂胶水、UV树脂胶、快干胶、热熔胶等。 这些胶粘剂都有不同的特点和适用场景&#xff0c;可以根据自己的需求选择合适的类型。 例如&#xff1a; 环氧树脂…

css3新增伪类有哪些?

在 CSS3 中引入了一些新的伪类&#xff0c;用于向选择器添加特定的状态或行为。以下是一些常见的 CSS3 新增的伪类&#xff1a; :nth-child() 和 :nth-of-type()&#xff1a;根据元素在其父元素中的位置选择元素。例如&#xff0c;:nth-child(odd) 选择所有奇数位置的子元素。 …

pdf转图片,pdf转图片在线转

pdf转图片的方法&#xff0c;对于许多人来说可能是一个稍显陌生的操作。然而&#xff0c;在日常生活和工作中&#xff0c;我们有时确实需要将pdf文件转换为图片格式&#xff0c;以便于在特定的场合或平台上进行分享、展示或编辑。以下&#xff0c;我们将详细介绍一个pdf转成图片…

用宝塔部署vue+springboot上线公网详细步骤

首先自己在腾讯云中按照教程安装好宝塔。这是宝塔面板&#xff0c;获取登录宝塔的网址和账号密码。 1.在navicat新建数据库 如果出现权限问题&#xff0c;可以在宝塔数据库面板phpMyAdmin中进行权限设置 navicat可以修改用户权限 2.在宝塔面板新建数据库 3.将前端打包的dist文件…

linux 部署瑞数6实战(维普,药监局)第一部分

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx 本文章未经许可禁止转载&…

【星海随笔】云解决方案学习日志篇(二) kafka、Zookeeper、Fielbeat

Elastic 中国社区官方博客 https://blog.csdn.net/ubuntutouch/category_9209092.html Kafka kafka的源代码是基于Scala语言编写的&#xff0c;运行在Java虚拟机&#xff08;即:JVM&#xff09;上。因此&#xff0c;在安装kafka之前需要先安装JDK Kafka 为什么依赖 Zookeepe…

52. QT插件开发--插件程序(带ui文件)的创建与编译

1. 说明 一般情况下,针对代码量比较小的QT程序不需要进行插件集成化开发,但是针对大型程序来说,代码结构比较复杂,使用插件开发的方式可以提高代码开发和维护效率,团队之间的分工合作也会更加的明确。所谓插件式开发,实际上就是把程序的一部分功能封装起来,编译成一个单…

一血c++

题目描述 每一个竞赛选手都无法拒绝拿一血 "一血"其实就是同学们在榜单上看到的深绿色的标记&#xff0c;代表着某道题目&#xff0c;他是第一个通过的。 叶苡朋老师是一名资深信奥选手&#xff0c;在大学多次获奖&#xff0c;也是一个资深抢一血爱好者&#xff0…

认识Redis 主从同步、事务和Memcached的区别

08- 什么是 Redis 主从同步&#xff1f; Redis 的主从同步(replication)机制&#xff0c;允许 Slave 从 Master 那里&#xff0c;通过网络传输拷贝到完整的数据备份&#xff0c;从而达到主从机制。 主数据库可以进行读写操作&#xff0c;当发生写操作的时候自动将数据同步到从…

AES加密、DES加密和RC4加密的区别

AES加密、DES加密和RC4加密在多个方面存在显著区别。以下是这些加密算法的详细对比&#xff1a; AES加密 算法原理&#xff1a; AES&#xff08;Advanced Encryption Standard&#xff09;采用对称密钥加密&#xff0c;利用分组密码的原理&#xff0c;将明文分成多个128位的组…

【C语言】解决C语言报错:Use of Uninitialized Variable

文章目录 简介什么是Use of Uninitialized VariableUse of Uninitialized Variable的常见原因如何检测和调试Use of Uninitialized Variable解决Use of Uninitialized Variable的最佳实践详细实例解析示例1&#xff1a;局部变量未初始化示例2&#xff1a;数组未初始化示例3&…

分布式物联网平台特点

随着物联网&#xff08;IoT&#xff09;技术的飞速发展&#xff0c;我们正步入一个万物互联的新时代。在这个时代&#xff0c;设备、数据和服务的无缝集成是实现智能化的关键。分布式物联网平台作为这一进程的核心&#xff0c;正在成为构建智能世界的基石。 一、分布式物联网平…

0403用代入法求解递归式-分治策略-算法导论第三版

文章目录 1.代入法求解递归式步骤1.1 求解步骤1.2 边界条件 2.做出好的猜测3.微妙的细节4.避免陷阱5.改变变量 结语 1.代入法求解递归式步骤 1.1 求解步骤 代入法求解递归式分两步&#xff1a; 猜测解的形式。用数学归纳法求出解中的常数&#xff0c;并证明解是正确的。 当…

C++ 47 之 函数调用运算符重载

#include <iostream> #include <string> using namespace std;class MyPrint{ public:// 重载小括号() 重载谁operator后就紧跟谁的符号void operator()(string txt){cout << txt << endl;} };class MyAdd{ public:int operator()(int a, int b){retur…

【Pandas驯化-04】Pandas中drop_duplicates、describe、翻转操作

【Pandas驯化-04】Pandas中drop_duplicates、describe、翻转操作 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 相关内容文档获取 微信公…

基于深度学习的光流预测

基于深度学习的光流预测 光流&#xff08;Optical Flow&#xff09;是指图像序列中像素的运动&#xff0c;即在连续的帧之间每个像素的移动向量。光流预测是计算机视觉中的一个重要任务&#xff0c;广泛应用于运动检测、视频分析、机器人导航等领域。基于深度学习的方法近年来…

redis大key优化

1.什么是大key以及可能造成的异常 1.1 什么大key redis是key,val型存储结构&#xff0c;key允许的最大大小为512MB&#xff0c;空字符串也是有效的键。大key是指value很大(占用大内存)。 常见的大key&#xff0c;大致可以这么分(根据具体redis规格以及实际压测而定): (1)单个…