news 2026/4/23 16:55:35

如何禁止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/4/23 14:48:28

学长亲荐10个AI论文软件,自考毕业论文轻松搞定!

学长亲荐10个AI论文软件&#xff0c;自考毕业论文轻松搞定&#xff01; AI工具如何助你轻松应对论文挑战 在自考学习过程中&#xff0c;毕业论文往往是最让人头疼的一环。从选题到撰写&#xff0c;再到反复修改&#xff0c;每一步都需要投入大量时间和精力。而随着AI技术的不断…

作者头像 李华
网站建设 2026/4/22 15:00:39

中高轨激光通信卫星伺服控制器抗辐照电源模块设计

摘要&#xff1a;随着中高轨道激光通信卫星技术的快速发展&#xff0c;伺服控制器作为激光链路建立与维持的核心执行单元&#xff0c;其电源模块的抗辐照特性成为保障星载设备长期可靠运行的关键要素。本文系统梳理了中高轨空间辐射环境特征及其对电源系统的损伤机理&#xff0…

作者头像 李华
网站建设 2026/4/18 11:21:23

Thiol-PEG₄-methyl,巯基聚乙二醇四单元甲基化,生物应用

Thiol-PEG₄-methyl&#xff0c;巯基聚乙二醇四单元甲基化&#xff0c;生物应用 中文名称&#xff1a;巯基聚乙二醇四单元甲基化&#xff08;Thiol-PEG₄-methyl&#xff09; Thiol-PEG₄-methyl 是一种功能化短链聚乙二醇&#xff08;PEG&#xff09;衍生物&#xff0c;其分…

作者头像 李华
网站建设 2026/4/23 5:48:16

中科院让AI大模型学会“分层思考“,底层神经元也能独当一面了

说起人工智能&#xff0c;我们通常把它当作一个整体来看待——输入问题&#xff0c;输出答案&#xff0c;就像一个黑盒子一样神秘。但中科院自动化研究所的研究团队却有了一个颠覆性的发现&#xff1a;原来AI大模型内部其实暗藏着许多"小助手"&#xff0c;每一层神经…

作者头像 李华
网站建设 2026/4/22 10:48:12

网络安全的“地基”怎么打?一文搞懂七大关键安全模型与框架

一、网络安全框架及模型是什么&#xff1f; 网络安全专业机构制定的一套标准、准则和程序&#xff0c;旨在帮助组织了解和管理面临的网络安全风险。优秀的安全框架及模型应该为用户提供一种可靠方法&#xff0c;帮助其实现网络安全建设计划。对于那些希望按照行业最佳实践来设…

作者头像 李华