C++含指针向量指针成员的类A拷贝构造函数实现问题
正确实现类A的深拷贝构造函数及问题分析
咱们先逐个分析你尝试的三种拷贝构造函数为什么会失败,再给出正确的实现方案:
问题根源:未初始化current指针
你尝试的三个选项都犯了同一个基础错误:在拷贝构造函数中,current指针还未被分配内存(是野指针)就直接解引用或调用成员函数,这直接导致了段错误(Option1、Option2),或者后续的其他错误(Option3)。
各选项具体错误分析
- Option #1:
*current = *a.current;这里current是未初始化的野指针,解引用它会直接触发非法内存访问,导致段错误。 - Option #2:
current->size()同样访问了未初始化的current指针,直接触发段错误。 - Option #3:除了
current未初始化的问题,new B((*a.current)[i].second)写法有误——你传入的是B*类型,但B的拷贝构造函数需要的是const B&类型,应该写成new B(*(*a.current)[i].second)。另外如果B没有定义合适的拷贝构造函数(比如默认拷贝构造被禁用),也会出现no match for operator *或构造函数匹配失败的错误。
正确的深拷贝构造函数实现
要完成深拷贝,需要分两步:
- 为新对象的
current指针分配新的vector内存; - 遍历原对象的
vector,对每个pair中的B*进行深拷贝(即创建新的B对象,而不是直接拷贝指针)。
假设B类有可用的拷贝构造函数(B(const B&)),正确的拷贝构造函数代码如下:
A::A(const A &a){ // 第一步:为current分配新的vector内存 current = new std::vector<std::pair<unsigned int, B*>>; // 第二步:遍历原vector,逐个深拷贝元素 for(const auto& pair_item : *a.current){ // 拷贝unsigned int(值类型,直接复制),深拷贝B对象 unsigned int id = pair_item.first; B* new_b = new B(*pair_item.second); current->emplace_back(id, new_b); } }
额外注意事项
- 如果
B是抽象类(包含纯虚函数),无法直接调用拷贝构造函数,此时需要给B类添加Clone虚函数(比如virtual B* Clone() const = 0;),然后在拷贝构造函数中调用pair_item.second->Clone()来创建新的B对象。 - 确保你的析构函数逻辑正确:遍历
vector删除每个B*,再删除current指针,这部分你的原代码是没问题的。
Clone函数是否需要调整?
你的Clone函数实现:
A* Clone() {return new A(*this);}
只要拷贝构造函数正确实现了深拷贝,这个Clone函数是完全没问题的,不需要调整——它通过调用拷贝构造函数创建了新的A对象,完成了深拷贝。
优化建议(可选)
为了避免手动管理裸指针带来的内存泄漏风险,建议使用智能指针:
- 把
current的类型从std::vector<...>*改为std::unique_ptr<std::vector<...>>,这样不用手动delete current,智能指针会自动管理内存。 - 或者直接将
current定义为std::vector<...>对象(而不是指针),这样可以省去new/delete的操作,但仍然需要自定义拷贝构造函数来深拷贝B*。
内容的提问来源于stack exchange,提问作者user1956185
相关产品推荐
相关产品推荐

