C++实现随机生成图矩阵时出现段错误的问题求助
问题原因
- 核心bug出在赋值逻辑的非法内存访问:外层循环
i仅完成了从0到当前i的行内存申请,当j > i时,graph[j]还未执行new操作,属于野指针,此时对graph[j][i]赋值就会触发段错误。 - 你当前的逻辑是想生成无向图的对称矩阵,直接在遍历
i行时给未初始化的j行赋值不符合内存申请的顺序。
修复方案
两种常用修改方式可选:
方案1:先完成所有内存申请再赋值
先把所有行的内存都申请完成,再遍历生成矩阵内容,从根源避免野指针问题:
#include <iostream> #include <ctime> #include <cstdlib> using namespace std; const int graph_size = 4; int main(void) { bool** graph; srand(time(0)); // 先申请所有行、列的内存 graph = new bool*[graph_size]; for(int i=0; i<graph_size; i++) { graph[i] = new bool[graph_size]; } // 再生成对称矩阵内容 for(int i=0; i<graph_size; i++) { for(int j=0; j<graph_size; j++) { if(i==j){ graph[i][j]=false; }else if(i < j){ // 仅给上三角赋值,对称同步到下三角即可 graph[i][j] = (((rand()%100)/100.0) < 0.19); graph[j][i] = graph[i][j]; } cout << graph[i][j]; } cout << endl; } // 手动释放堆内存避免内存泄漏 for(int i=0; i<graph_size; i++){ delete[] graph[i]; } delete[] graph; return 0; }
方案2:调整赋值逻辑,仅访问已初始化的行
如果不想提前申请所有内存,可以仅在j <= i的时候执行赋值操作,避免访问还未初始化的graph[j]内存。
额外优化建议
如果使用C++11及以上版本,推荐用vector容器代替手动申请的二级指针,内存由容器自动管理,不会出现野指针、内存泄漏等问题,开发效率更高。
内容的提问来源于stack exchange,提问作者Matheus Bellini
相关产品推荐
相关产品推荐

