You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带指针成员的C++类未复现默认拷贝构造重复释放问题咨询

问题核心原因

你的代码存在两处逻辑错误,和编译器适配无关:

  • 你已经手动实现了自定义拷贝构造函数,此时编译器不会再生成默认拷贝构造函数。你写的自定义拷贝构造中主动执行了m_height = new int(*p.m_height),本身就是深拷贝逻辑,自然不会出现浅拷贝导致的同一块内存重复释放问题。
  • 你打印的&m_height是指针变量本身在对象内存中的栈地址,每个独立对象的成员变量本身肯定有不同的存储地址,要验证指针指向的堆地址是否相同,应该直接打印m_height的值。

复现浅拷贝问题的修改方法

你可以做两处修改验证讲师的说法:

  1. 删除你代码中所有自定义拷贝构造Person(const Person &p)的实现代码,让编译器自动生成默认拷贝构造函数
  2. 将test01中的打印逻辑修改为输出指针指向的堆地址:
cout << "age of p1: " << p1.m_age <<", height pointer:" << p1.m_height << endl;
// 后面p2的打印同理改为p2.m_height

修改后运行你会看到p1和p2的m_height值完全相同,指向同一块堆内存,程序运行到析构阶段会触发double free错误,部分运行环境会直接崩溃。


补充说明

C++标准从未修改默认拷贝构造的逻辑,默认拷贝构造永远是对成员变量做逐值拷贝(浅拷贝),对于指针成员只会拷贝存储的地址值,不会主动申请新的堆内存拷贝地址指向的内容。

内容的提问来源于stack exchange,提问作者JPPPPP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 19:27:02