生成随机加权图函数在特定边数阈值后冻结问题排查
问题分析与修复方案
1. 内存越界:崩溃的直接原因
你在分配边数组时犯了核心错误:
edge *edges = new edge[nrOfNodes+1];
这里仅分配了nrOfNodes+1个edge对象,但你需要生成的边数是nrOfNodes*4。当nrOfNodes ≥8时,nrOfNodes*4会远大于nrOfNodes+1(比如n=8时,需要32条边,但只分配了9个存储位置),访问edges[31]必然触发内存越界,这就是打印时程序崩溃的直接原因。
正确的分配方式应为:
int nrOfEdges = nrOfNodes *4; edge *edges = new edge[nrOfEdges];
2. 死循环:程序冻结的根源
n节点的无向图最多只能有n*(n-1)/2条不同的边(完全图结构)。当你要求生成的边数4*n超过这个最大值时,循环会永远无法结束,进入死循环,表现为程序冻结。
比如n=8时,最大边数是8*7/2=28,但你要生成32条边,counter到28后就无法再增加,while(counter < nrOfEdges)会持续执行,导致程序卡住。
解决方法:提前判断目标边数是否超过理论最大值,超过则调整为最大值:
#include <algorithm> // 需包含此头文件使用min函数 int maxPossibleEdges = nrOfNodes * (nrOfNodes - 1) / 2; int nrOfEdges = std::min(nrOfNodes *4, maxPossibleEdges);
3. 非标准变长数组的潜在风险
代码中使用了变长数组:
int adjMatrix[nrOfNodes+1][nrOfNodes+1] = {0};
C++标准并不支持变长数组(这是C99特性,仅部分编译器作为扩展支持),当nrOfNodes较大时,该数组会在栈上分配,极易引发栈溢出,导致未知错误。
推荐改用std::vector实现邻接矩阵:
#include <vector> std::vector<std::vector<int>> adjMatrix(nrOfNodes+1, std::vector<int>(nrOfNodes+1, 0));
4. 随机种子的缺失(非当前崩溃原因,但需修正)
rand()函数使用前需要用srand(time(nullptr))初始化随机种子,否则每次运行生成的随机图完全一致,失去随机性。
内容的提问来源于stack exchange,提问作者Kudor
相关产品推荐
相关产品推荐

