You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成随机加权图函数在特定边数阈值后冻结问题排查

问题分析与修复方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 13:40:27