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

通过下标与等号运算符重载实现类多维数组赋值取值的问题求助

C++ Matrix类[]运算符重载问题修复

你的代码存在几个核心逻辑错误,逐一修复后即可正常运行:

  • 构造函数数组越界:分配内存的循环内错将循环变量i写成了矩阵行数x,m[x]直接访问到指针数组的越界位置,是触发段错误的核心原因
  • 指针调用逻辑错误:main函数中你将m声明为Matrix指针类型,直接写m[2]执行的是指针偏移运算,访问的是第3个Matrix对象的内存,而非调用你重载的[]运算符
  • 冗余运算符逻辑:Proxy类中自定义的operator=完全多余,你已经在Proxy::operator[]中返回了std::string的左值引用,直接使用std::string自带的赋值逻辑即可
  • 内存管理缺失:没有实现对应的析构函数释放堆内存,会产生内存泄漏,同时未处理拷贝构造、拷贝赋值逻辑,不符合C++三五规则

修复后可运行代码

#include <iostream>
#include <vector>
#include <string> 

class Matrix {
  std::string **m;
  int row, col;
 public:
  Matrix(int x, int y) : row(x), col(y) {
    m = new std::string*[x];
    for (int i = 0; i < x; i++)
      // 修复下标错误
      m[i] = new std::string[y];
  }
  // 新增析构函数释放内存
  ~Matrix() {
    for (int i = 0; i < row; i++)
      delete[] m[i];
    delete[] m;
  }
  class Proxy {
    std::string *mm;
  public:
    Proxy(std::string *s) : mm(s) {}
    std::string &operator[](int index) {
      return mm[index];
    }
    // 移除多余的operator=实现
  };
  Proxy operator[](int index) {
    return Proxy(m[index]);
  }
  // 避免浅拷贝问题,禁用默认拷贝构造、拷贝赋值,有需要可自行实现深拷贝逻辑
  Matrix(const Matrix&) = delete;
  Matrix& operator=(const Matrix&) = delete;
};

int main()
{
  // 改为栈对象,不需要手动管理内存,也避免指针调用错误
  Matrix m(5, 5);
  m[2][2] = std::string("It Works");
  std::cout << m[2][2] << std::endl;
  return 0;
}

如果要保留原来的指针写法,将赋值和输出的语句改为(*m)[2][2]即可正常运行。如果追求更安全的实现,建议直接用std::vector<std::vector<std::string>>代替裸指针管理二维数组,不需要手动处理内存分配和越界风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:57:00