尝试解决HackerRank上的BFS质询时出现错误的alloc异常

时间:2016-05-26 11:37:45

标签: c++ exception out-of-memory breadth-first-search bad-alloc

所以我试图制作这个挑战:广度优先搜索:HackerRank的最短距离,但是当测试有大量的节点/边缘时,我一直得到错误的alloc异常。该程序适用于第一次测试,所以我不认为,实施有问题。 所以这是实现: (对不起缩进,我的第一个问题)

select

我做错了什么,我还没有看到其他人在网站的讨论部分抱怨此事。 我怎样才能避免抛出异常以及它从哪里来? 谢谢!

1 个答案:

答案 0 :(得分:0)

我不确切地知道你的例外的原因是什么;并且我不知道如何重现你的问题,因为从输入值中取决于(我猜)。我猜想有很多输入值。

但是我看到了你的代码的一些弱点(恕我直言),所以我试着把注意力集中在它们上面。

1)您在std::queue周期中分配for

queue <int> *que = new queue<int>();

但你永远不会释放它;这是浪费记忆

2)你正在使用C风格的可变长度数组

int dist[n + 1] = {-1};
bool visited[n + 1] = {false};
int parents[n + 1] = {-1};

它们不是有效的C ++标准代码。我建议您使用标准容器(std::vectorstd::queue)。

3)您正在使用仅包含元素(-1false)的初始化列表初始化C样式的可变长度数组。我想您的意图是使用n+1-1初始化所有false个元素。但是此语法仅使用-1false初始化数组的第一个元素。

如果要将所有n+1元素初始化为-1false,解决方案是(再次)使用标准容器;通过例子

std::vector<int>   dist(n+1, -1);
std::vector<bool>  visited(n+1, false);
std::vector<int>   parents(n+1, -1);

4)您无需检查边界即可访问数组。例如:

cin >> snode;
dist[snode] = 0;

其中snodeint变量;如果插入负值或超过n的值,则会将dist写出其边界,从而破坏内存。我想,这可以解释你的错误的分配异常&#34;。

建议:使用标准容器(再次)而不是C样式数组,并使用at()(执行边界检查)而不是[];所以

cin >> snode;
dist.at(snode) = 0;

5)抱歉我的英语不好(好吧,我开玩笑说:这不是你的弱点之一;这是我的一个。)