当前位置: 首页 > 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://icebutterfly214.com/news/155135/

相关文章:

  • 利尔达荣获维科杯·OFweek2025物联网行业杰出标杆企业奖
  • indent and unindent in vscode and its descendant when tab/shift-tab not work
  • 七载同行共铸卓越,利尔达展芯荣膺纳芯微“风雨同舟奖”!
  • 2025年GEO优化服务商:抢占AI搜索流量新蓝海 - 品牌测评鉴赏家
  • 导入 MySQL
  • 微信公众号SVG玩法全测评:点击自动换图
  • 153_尚硅谷_切片的内存布局分析
  • 2025国内镁合金售后较好知名品牌企业有哪些,行业十大优质厂家推荐,靠谱看市场给口碑 - 品牌推荐大师1
  • MBTI测试网站哪个好?体验感与准确度对比 - 品牌排行榜
  • 【大模型轻量化新突破】:Open-AutoGLM mlx实现8倍加速背后的5个关键技术
  • Linux shell 脚本示例:使用 pkill 清理各种服务进程
  • 从工具到伙伴:AI知识库如何重塑企业数字化转型逻辑
  • 中考体育评价系统的设计与实现任务书
  • 629张10种细菌类型革兰染色培养基平板图像数据集-用于细菌自动分类临床诊断微生物学研究AI模型训练的高清PNG图像数据集-疾病诊断、治疗方案制定、抗生素合理使用-开发和训练细菌自动分类算法
  • 上海建工3D打印人行桥在泉州落成
  • Python 中装饰器和内存回收的说明
  • 基于IBERT的GTX收发器眼图测试实践
  • Win7系统程序终止问题的全面修复方案
  • 为什么顶级AI实验室都在悄悄测试Open-AutoGLM mlx?真相令人震惊
  • 15款大模型透明度测评:两款允许用户撤回数据不投喂AI(文末附报告领取方式)
  • 2025年上海代理记账生产厂家、诚信供应商推荐:靠谱的代理记账公司有哪些? - 工业品网
  • 仅需4步!轻松完成智谱AI Open-AutoGLM本地部署(附完整脚本与配置模板)
  • 告别手动调参时代,Open-AutoGLM如何实现全流程自主优化?
  • 实用指南:基于Python的影视推荐平台的设计与实现:大四毕设技术全覆盖!Java 开发 + Python 可视化分析+ 小程序 / APP 前端部署(免费源码直接领)(大四计算机生收藏)
  • DXC蒲公英计划:为神经多样性IT专业人士赋能
  • 0195-03682驱动器模块
  • 【Open-AutoGLM虚拟化部署全攻略】:手把手教你挂载虚拟机实现高效AI推理
  • 错过Open-AutoGLM沉思插件,可能让你的AI项目落后整整一代(仅限内部分享的部署方案)
  • 2025论文写作终极神器:9款免费AI生成器,真实文献+低查重高原创!
  • 企业邮箱系统哪个好?2025年企业邮箱系统对比与推荐 - U-Mail邮件系统