带指针成员的C++类未复现默认拷贝构造重复释放问题咨询
问题核心原因
你的代码存在两处逻辑错误,和编译器适配无关:
- 你已经手动实现了自定义拷贝构造函数,此时编译器不会再生成默认拷贝构造函数。你写的自定义拷贝构造中主动执行了
m_height = new int(*p.m_height),本身就是深拷贝逻辑,自然不会出现浅拷贝导致的同一块内存重复释放问题。 - 你打印的
&m_height是指针变量本身在对象内存中的栈地址,每个独立对象的成员变量本身肯定有不同的存储地址,要验证指针指向的堆地址是否相同,应该直接打印m_height的值。
复现浅拷贝问题的修改方法
你可以做两处修改验证讲师的说法:
- 删除你代码中所有自定义拷贝构造
Person(const Person &p)的实现代码,让编译器自动生成默认拷贝构造函数 - 将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
相关产品推荐
相关产品推荐

