C++矩阵乘法函数触发vector析构错误退出码0xC0000005
错误原因
- 核心问题为非void函数未返回有效值触发的未定义行为:你的
matrix_multiplication函数声明返回类型为std::vector<std::vector<int>>,但两个版本的实现均未添加return res;语句。C++标准明确规定,非void函数执行结束未返回有效值属于未定义行为,在你的运行环境中表现为返回值对应的vector对象内存布局被破坏,程序退出析构该非法对象时触发内存访问错误(退出码0xC0000005是Windows平台标准的内存访问违规错误码)。 - 崩溃点落在vector析构函数的原因:函数调用约定下,编译器会在调用方(main函数)负责析构
matrix_multiplication的返回值对象,但由于你没有正确返回构造完成的res对象,返回值对象的内部成员指针是非法值,析构时访问非法内存就会触发崩溃。
修复方案
有两种可选修复方式:
- 保留返回值设计:在
matrix_multiplication函数的最后一行添加return res;语句即可,修改后的函数示例:
std::vector<std::vector<int>> matrix_multiplication(std::vector<std::vector<int>> &a, std::vector<std::vector<int>> &b, size_t n){ std::vector<std::vector<int>> res ( n ); for (int i = 0; i < n; ++i) { res[i].assign ( n, 0 ); } for ( size_t i = 0; i < n; i++ ) { for ( size_t j = 0; j < n; j++ ) { int sum = 0; for ( size_t k = 0; k < n; k++ ) { sum += a[i][k] * b[k][j]; } res[i][j] = sum; } } return res; // 新增此行 }
- 不需要返回结果的场景:直接将函数返回值类型修改为
void,不需要改动其他逻辑即可解决崩溃问题。
内容的提问来源于stack exchange,提问作者mohammad
相关产品推荐
相关产品推荐

