C++实现A->*B->*C关联类拷贝构造深拷贝的代码正确性咨询
评审结论
你写的代码不符合任务要求,也无法实现正确的深拷贝逻辑,存在多处问题。
具体问题
- 基础语法错误:三个类的定义结尾都没加分号,代码根本过不了编译。
- 违反实现约定:任务明确说明不需要额外实现其他构造函数,你为类A、类B都编写了接收list参数的自定义构造,不符合要求。
- 容器选型逻辑错误:你用存裸指针的
std::list<T*>保存关联对象,就算把指针复制到新列表里,新旧对象还是指向同一块内存,本质是浅拷贝,后续要么修改一个对象另一个跟着联动变更,要么释放内存时出现重复释放的崩溃问题。 - 深拷贝逻辑完全缺失:你写的类A拷贝构造仅复制了
iA_成员,完全没有处理关联的B对象列表,拷贝出来的新A对象没有复制原对象关联的B、C对象,根本不满足拷贝需求。 - 类B没有实现对应拷贝处理逻辑,就算A的列表完成复制,B下挂载的C对象也无法正确独立复制。
符合要求的实现方案
这个需求不需要手动编写任何自定义构造、析构函数,直接使用编译器默认生成的函数即可,合理性依据如下:
- 类C仅包含int类型成员,没有任何需要特殊处理的资源,编译器默认生成的拷贝、析构逻辑完全正确。
- 关联容器不要存指针,直接存储对象值:
std::list本身的拷贝构造会自动把列表里的每个元素复制一份到新列表,复制过程会自动调用元素类型的拷贝构造:- 类B中存储
std::list<C>,拷贝B的时候,列表里的所有C对象都会被复制为独立新实例,不存在多个B共享同一个C的问题 - 类A中存储
std::list<B>,拷贝A的时候,列表里的所有B对象都会被复制为独立新实例,每个B复制时又会自动复制自己持有的C对象,从A到B到C全链路都是独立对象,天然实现深拷贝
- 类B中存储
- 因为所有成员都是值类型,没有裸指针指向堆内存,编译器默认生成的析构函数会自动正确释放所有资源,不需要手动实现。
最终符合要求的代码如下:
#include <list> class C { private: int iC_; }; class B { private: int iB_; std::list<C> CList_; }; class A { private: int iA_; std::list<B> BList_; };
内容的提问来源于stack exchange,提问作者FooStack
相关产品推荐
相关产品推荐

