当前位置: 首页 > news >正文

如何禁止C++类对象的禁止拷贝操作

如何禁止C++类对象的禁止拷贝操作

类对象禁止拷贝

只需要在将构造函数声明为如下形式即可

class A { public: A() = default; private: A(const A&) = delete; };

如果使用下面的声明则会报错

int main() { A a; A b = a; // compile-time error }

运行g++编译会报错

main.cpp: In function ‘int main()’: main.cpp:10:15: error: use of deleted function ‘A::A(const A&)’ 10 | A b = a; | ^ main.cpp:5:9: note: declared here 5 | A(const A&) = delete; | ^

禁止使用操作符=

struct Counter { int* p; Counter(int v) { p = new int(v); } ~Counter() { delete p; } }; int main() { Counter a(1); Counter b(2); a = b; }

使用gdb调试,设置断点在a=b

(gdb) print a $1 = {p = 0x55555556aeb0} (gdb) print *a No symbol "operator*" in current context. (gdb) print b $2 = {p = 0x55555556aed0}

可以看出ab中的成员变量p的值是不同的

现在step next,再看看a和b的值

18 } (gdb) print a $7 = {p = 0x55555556aed0} (gdb) print b $8 = {p = 0x55555556aed0}

我们可以看到,二者都一样了,即两个变量的成员变量p都指向了同一个地址,地址内的值是2

(gdb) print *a->p $9 = 2 (gdb) print *b->p $10 = 2

然后退出主函数之前调用析构函数

(gdb)s Counter::~Counter(this=0x7fffffffdd00,__in_chrg=<optimized out>)at main.cpp:99delete p;(gdb)n10}(gdb)print this->p$13=(int *)0x55555556aed0(gdb)print *this->p$14=1431655786

可以看到地址内的值已被其他的值替换

问题是删除了a的值,那b的值也删除了,原来a的p值并没有被delete

(gdb) print /x *0x55555556aeb0 $17 = 0x1

相当于这里有个指针变量被悬空了,由于C++没有垃圾回收,那么这个内存就一直占据内存,如果数量庞大则会导致内存溢出。

如果要避免这种情况的发生,则可使得运算符设置为不允许拷贝

struct Counter { int* p; Counter(int v) { p = new int(v); } ~Counter() { delete p; } Counter& operator=(const Counter&) = delete; }; int main() { Counter a(1); Counter b(2); a = b; }

使用g++进行编译

jx@jx-virtual-machine:~/src/cpp$ g++ main.cpp -o main main.cpp: Infunction‘int main()’: main.cpp:19:7: error: use of deletedfunction‘Counter&Counter::operator=(const Counter&)19|a=b;|^ main.cpp:12:12: note: declared here12|Counter&operator=(const Counter&)=delete;|^~~~~~~~
http://www.rkmt.cn/news/159035.html

相关文章:

  • PLC ethercat总线伺服资料 信捷PLC EtherCat总线9轴凸轮伺服,包括PLC...
  • 2025年12月江苏徐州装修、装修设计、装修施工、设计工作室、别墅设计哪家专业可靠 - 2025年品牌推荐榜
  • 铜箔加工制造商推荐:一站式服务+快速打样(附案例) - 品牌排行榜
  • 不同操作系统下MySQL安装详细指南与步骤解析
  • Unity WebGL jslib 通信时,传入字符串,变成数值 问题
  • 新手必备!8大公众号运营免费神器全面测评(2025最新版)
  • 2025年龙门吊设备厂家实力推荐榜:智能单梁起重机/电动单梁起重机/桥式起重机源头厂家精选 - 品牌推荐官
  • 2025最新!10个AI论文平台测评:继续教育写论文不再难
  • 2025自考必备10个降AI率工具
  • 导入 MySQL
  • 12.26 DOM 的Element
  • 2025年绞线卧式拉力试验机源头厂家权威推荐榜单:钢丝绳卧式拉力机/卧式绝缘子拉力机/链条卧式拉力试验机源头厂家精选 - 品牌推荐官
  • 盘点2025年口碑最佳的无线信号测量仪表品牌,无线电综合测试测试仪/光通信测量仪表/频谱仪/电子对抗设备无线信号测量仪表品牌推荐排行榜 - 品牌推荐师
  • 2025年皮带输送机厂家推荐榜:皮带传送带输送机/带式给料机/传送带输送机源头厂家精选 - 品牌推荐官
  • WT2605A芯片在多场景录音产品中的定制化应用方案
  • 2025年12月三圣乡宴席/婚宴/寿宴/团建聚会农家乐深度推荐报告 - 2025年品牌推荐榜
  • 探究Openresty中ngx.re与Lua string.re两种正则的选择
  • 2025年杭州可靠的GEO品牌推荐,GEO优化/豆包优化排名/GEO优化AI工具排名/豆包优化/GEO优化AI搜索GEO老牌厂家哪家好 - 品牌推荐师
  • 2025综合评测:上海哪家装修公司最值得选择? - 品牌排行榜
  • 2025国内镁合金售后较好知名品牌企业有哪些,行业十大优质厂家推荐,靠谱看市场给口碑 - 品牌推荐大师1
  • 网络设备实训室如何选?十年职教实战派解析与厂家深度推荐 - 深度智识库
  • 华东配电柜壳体选型:为何重视双层保温 + “今天国际”供应链? - 品牌排行榜
  • SQL Server中验证大小字母和数字
  • 2025年12月中小客户管理系统软件实力榜:工单管理系统、商机管理系统、业务系统、财务系统、项目管理系统、费用报销系统、一体化管理系统四家企业凭安全适配与口碑出圈 - 海棠依旧大
  • Java毕设项目:基于springboot的汽车租赁管理系统(源码+文档,讲解、调试运行,定制等)
  • 2025年引纸绳行业口碑榜:可靠厂家全解析,柔性吊装带/船用缆绳/电缆网套/钢锭吊具/防割吊带,引纸绳源头厂家哪家好 - 品牌推荐师
  • 大模型面试题19:梯度消失梯度爆炸 纯白话文版
  • 语义层面的SQL注入:LLM 提示词注入攻击深度拆解
  • 2025年改性阻燃pc/abs厂家推荐榜:改性阻燃abs/透明abs758/透明abs050源头厂家精选 - 品牌推荐官
  • MBTI测试网站哪个好?体验感与准确度对比 - 品牌排行榜