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

C++中如何让类成员vector<shared_ptr<T>>拷贝后互相独立?

关于vector、shared_ptr与拷贝构造的问题解答

默认拷贝行为说明

你给出的Game类未自定义拷贝构造函数,编译器会生成默认拷贝构造,执行Game game2 = game1;时的行为如下:

  • 两个board vector的地址完全不同:game1和game2是两个独立的对象,它们的成员变量本身就位于不同内存地址,且std::vector的拷贝构造会为新vector分配独立的底层存储数组,不存在两个vector地址相同的情况。
  • 两个vector内部存储的shared_ptr<Character>元素内容完全一致:拷贝vector时会逐个复制内部元素,shared_ptr的拷贝操作仅复制指针本身、增加对应托管Character对象的引用计数,不会生成新的Character实例,因此两个vector同位置的shared_ptr指向同一个Character对象。

独立需求实现说明

你提到的「vector地址不同但内部的shared_ptr元素内容完全一致」的效果,默认拷贝行为已经直接满足,不需要额外修改代码。

如果你需要更进一步让两个Game的Character实例也完全独立(即深拷贝整个对象结构),则需要自定义Game的拷贝构造函数,示例代码如下:

class Character 
{
public:
    // 简单场景下使用编译器默认生成的拷贝构造即可
    int health;
    // 其余成员...
};

class Game 
{
public:
    // 原有构造逻辑...
    // 自定义拷贝构造实现深拷贝
    Game(const Game& other) : size(other.size) {
        board.reserve(other.board.size());
        for (const auto& ptr : other.board) {
            // 复制Character实例,生成新的shared_ptr
            board.push_back(std::make_shared<Character>(*ptr));
        }
    }
    // 如需支持拷贝赋值,也需要对应实现拷贝赋值运算符,遵循三五法则即可
private:
    int size;
    std::vector<std::shared_ptr<Character>> board;
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:15:00