C++重载+运算符对二维向量求和时触发Segmentation fault
问题根因
触发段错误的核心原因是越界访问未分配的内存:
- 你在
operator+中创建的返回值对象r是默认初始化的,其内部成员vector<vector<int>> a是空的,既没有分配行空间,也没有分配每行的列元素空间。 std::vector的下标运算符[]只能访问已经存在的元素,不会自动扩容创建新元素,你直接执行r.a[i][j] = ...属于非法访问未申请的内存地址,直接触发段错误。
修复方案
只需要修改operator+的实现,在逐元素求和前,先给结果矩阵r分配和输入矩阵尺寸完全匹配的内存空间即可,不需要修改头文件引入和main函数,完全符合题目要求。
修复后的完整可运行代码如下:
#include <cmath> #include <cstdio> #include <vector> #include <iostream> #include <algorithm> using namespace std; class Matrix { public: vector<vector<int>> a; public: friend Matrix operator+(Matrix, Matrix); }; Matrix operator+(Matrix m1, Matrix m2) { Matrix r; // 分配和输入矩阵一致的行数 r.a.resize(m1.a.size()); for (int i = 0; i < m1.a.size(); i++) { // 给当前行分配对应列数的存储空间 r.a[i].resize(m1.a[i].size()); for (int j = 0; j < m1.a[i].size(); j++) { r.a[i][j] = m1.a[i][j] + m2.a[i][j]; } } return r; } int main () { int cases,k; cin >> cases; for(k=0;k<cases;k++) { Matrix x; Matrix y; Matrix result; int n,m,i,j; cin >> n >> m; for(i=0;i<n;i++) { vector<int> b; int num; for(j=0;j<m;j++) { cin >> num; b.push_back(num); } x.a.push_back(b); } for(i=0;i<n;i++) { vector<int> b; int num; for(j=0;j<m;j++) { cin >> num; b.push_back(num); } y.a.push_back(b); } result = x+y; for(i=0;i<n;i++) { for(j=0;j<m;j++) { cout << result.a[i][j] << " "; } cout << endl; } } return 0; }
补充说明:题目给出的main函数中保证了两个输入矩阵尺寸完全一致(都是n行m列),所以直接按m1的尺寸初始化结果矩阵不会出现尺寸不匹配的问题。
内容的提问来源于stack exchange,提问作者Kawaki
相关产品推荐
相关产品推荐

