C++实现2层隐藏层神经网络eclipse调试找不到malloc.c错误求解
问题根因说明
你看到的Can't find a source file at "/build/glibc-eX1tMB/glibc-2.31/malloc/malloc.c"错误不是真的缺少源码文件,本质是你的代码触发了堆内存越界/破坏,调试器想要定位glibc内存分配的内部源码时找不到对应的文件,你的推测正确,该错误确实和内存分配/访问异常相关。
已排查到的代码问题
- 转置函数未做入参合法性校验:
transpose_matrix函数第一行直接访问matrix[0].size(),如果传入的w2是空矩阵,或者所有行长度不一致,都会触发数组越界访问,破坏堆内存结构,最终触发内存分配相关的报错。你之前调用transpose_matrix处理w3时没有报错,是因为w3的尺寸合法,而循环中执行到w2转置时w2已经是空矩阵/行长度不一致的非法矩阵。 - 代码存在未定义类型:你给出的代码片段中
Row类型未定义,若实际代码中Row不是vector<float>的别名,initialize_matrix生成的矩阵就会存在行结构异常,后续转置时就会触发越界。 - 随机种子初始化逻辑错误:
srand(time(NULL))不应该放在矩阵初始化函数内部,该函数如果被多次调用,同一秒内的调用都会得到完全相同的随机序列,属于逻辑隐患。
修复后的transpose_matrix参考实现
// 补充缺失的类型定义 typedef vector<float> Row; typedef vector<vector<float>> Matrixx; Matrixx transpose_matrix(Matrixx& matrix) { int row_size = matrix.size(); // 先判断矩阵是否为空,避免越界 if (row_size == 0) { return {}; } int col_size = matrix[0].size(); // 初始化时直接指定转置矩阵的尺寸,减少后续操作出错概率 Matrixx tpose(col_size, vector<float>(row_size)); for (int i = 0; i < row_size; i++) { // 校验所有行长度一致,避免非法矩阵输入 if (matrix[i].size() != col_size) { return {}; } for (int j = 0; j < col_size; j++) { tpose[j][i] = matrix[i][j]; } } return tpose; } // 随机种子srand(time(NULL))移到main函数启动时执行一次即可,不要放在initialize_matrix内部
临时验证方法
你可以在调用w2_transpose = transpose_matrix(w2);之前先打印w2.size()以及非空情况下w2[0].size()的值,大概率可以看到w2的尺寸为0或者行长度异常。
内容的提问来源于stack exchange,提问作者xos
相关产品推荐
相关产品推荐

