通过下标与等号运算符重载实现类多维数组赋值取值的问题求助
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
相关产品推荐
相关产品推荐

