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

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 *或构造函数匹配失败的错误。

正确的深拷贝构造函数实现

要完成深拷贝,需要分两步:

  1. 为新对象的current指针分配新的vector内存;
  2. 遍历原对象的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:19:05