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

C++ Game类拷贝构造函数使用vector的[]运算符报错及内存分配问题咨询

[]运算符报错原因

你代码中的报错根本原因是迭代器不能作为[]运算符的入参:

  • 你定义的row和col都是迭代器类型,而C++的[]运算符仅支持整数类型的下标索引,不接受迭代器作为参数,因此编译器找不到匹配的运算符实现,直接抛出类型不匹配的错误。
  • 额外存在逻辑错误:你在拷贝构造函数内部创建了局部Game game对象,该对象在构造函数执行完成后会立即销毁,你拷贝的所有数据都不会写入当前正在构造的新Game实例,属于无效操作。
代码修复方案

如果你的Game类的game成员本身就是vector<vector<char>>类型,不需要手动写循环拷贝,vector默认的拷贝构造就是深拷贝,直接用初始化列表初始化成员即可,代码更安全简洁:

Game::Game(const Game& other) : height(other.height), width(other.width), game(other.game)
{}

如果你确实需要手动实现拷贝逻辑,使用下标遍历即可:

Game::Game(const Game& other) : height(other.height), width(other.width), game(height, vector<char>(width))
{
    for (int i = 0; i < height; ++i) {
        for (int j = 0; j < width; ++j) {
            game[i][j] = other.game[i][j];
        }
    }
}
实例创建方式选择

优先选择栈上直接声明Game实例:

  • 不需要手动管理内存,对象生命周期由作用域自动控制,不会出现内存泄漏、野指针等问题
  • 栈内存分配速度远快于堆内存,运行效率更高

仅当满足以下两个条件之一时,才考虑用new在堆上分配Game实例:

  1. 对象生命周期需要超出当前作用域
  2. 实例体积过大,超过栈内存的容量上限
    使用堆分配时,必须配合std::unique_ptr或std::shared_ptr等智能指针管理内存,禁止裸用new和手动调用delete,避免内存管理错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:09:02