news 2026/9/8 22:37:02

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何禁止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;|^~~~~~~~
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 20:04:43

学长亲荐9个AI论文工具,研究生高效写作必备!

学长亲荐9个AI论文工具&#xff0c;研究生高效写作必备&#xff01; AI 工具助力论文写作&#xff0c;效率提升不是梦 在研究生阶段&#xff0c;论文写作不仅是学术能力的体现&#xff0c;更是时间与精力的挑战。随着 AI 技术的不断进步&#xff0c;越来越多的智能工具被引入到…

作者头像 李华
网站建设 2026/9/2 20:04:43

利尔达荣获维科杯·OFweek2025物联网行业杰出标杆企业奖

12月19日&#xff0c;维科杯OFweek2025&#xff08;第十届&#xff09;物联网行业年度评选颁奖典礼暨答谢晚宴在深圳圆满落幕。凭借卓越的市场表现、持续的技术创新能力及在多领域的深度场景落地成果&#xff0c;利尔达成功斩获2025年度“杰出标杆企业奖”。作为物联网领域极具…

作者头像 李华
网站建设 2026/9/4 4:22:51

不同操作系统下MySQL安装详细指南与步骤解析

MySQL是一种广泛使用的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;。它通常与许多应用程序一起使用&#xff0c;包括Web应用程序、企业级软件及数据存储解决方案。随着其在全球的普及&#xff0c;用户可以在多种操作系统上安装MySQL。本文将详细介绍如何在不同操作…

作者头像 李华
网站建设 2026/9/4 9:24:06

2025必备10个降AI率工具,MBA人必看!

2025必备10个降AI率工具&#xff0c;MBA人必看&#xff01; AI降重工具&#xff0c;MBA人不可不知的利器 在当前学术环境日益重视原创性的背景下&#xff0c;MBA学生和研究者面对论文写作时&#xff0c;往往需要同时兼顾内容质量与查重率。随着AIGC&#xff08;人工智能生成内容…

作者头像 李华
网站建设 2026/9/6 11:22:42

OPPO与新加坡国大MemEvolve:AI记忆系统实现自我进化

这项由OPPO AI智能体团队与新加坡国立大学LV-NUS实验室共同完成的突破性研究发表于2024年12月23日&#xff0c;研究成果已在arXiv平台发布&#xff08;论文编号&#xff1a;2512.18746v1&#xff09;。有兴趣深入了解的读者可以通过该编号查询完整论文&#xff0c;相关代码也已…

作者头像 李华
网站建设 2026/9/5 1:13:38

设计模式的分类

创建型模式 用于描述怎样创建对象&#xff0c;它的主要特点是将对象的创建与使用分离 单例&#xff0c;原型&#xff0c;工厂方法&#xff0c;抽象工厂&#xff0c;建造者 结构型模式 用于描述如何将类或对象按某种布局组成更大的结构 代理&#xff0c;适配器&#xff0c;桥接&…

作者头像 李华