插入时无效的堆。 (仅在调试模式下)

时间:2015-02-09 05:11:22

标签: c++ debugging stl runtime-error heap

前言

  • mNodes _ 是一个向量,其中包含
  • 向量
  • openList 是一个 vector ,其中包含 Node 指针,指向 mNodes_中的 Node

我正在尝试修复我遇到的崩溃,因此我在调试模式下运行了VS2013(社区版)。但是,当它遇到以下代码段时,它现在在调试模式下崩溃:

//If the node is not already on the open/closed list
Node listCheckNode = mNodes_.at((int)(node.getPosition().x / 32)).at((int)(node.getPosition().y / 32));
if (!listCheckNode.isOnClosed() && !listCheckNode.isOnOpen())
{
    mNodes_.at((int)(node.getPosition().x / 32)).at((int)(node.getPosition().y / 32)) = node;
    openList.push_back(&mNodes_.at((int)(node.getPosition().x / 32)).at((int)(node.getPosition().y / 32)));
    std::push_heap(openList.begin(), openList.end(), [](Node* lhv, Node* rhv) { return lhv->getTotalValue() > rhv->getTotalValue(); });
}

具体来说, std :: push_heap 。现在,当它第一次点击这一行时就不会发生这种情况,因为我知道之前有 Node *被推入:enter image description here

我听说如果我直接修改堆会发生这种情况,但我不记得这样做了。如果您需要更多代码,请提及它。

谢谢!

编辑:我注意到,当openList(位置0)顶部的项目和节点具有相同的总值时,我收到此错误。堆是不是能够包含两个相同的键值?我可以创建一个在其子节点之间具有> =关系的堆而不是>关系。

编辑2:我已将所有内容更改为 std :: priority_queue ,它使用的是使用">"运营商进行比较。我仍然得到错误。 我几乎可以肯定,当* std :: priority_queue *

中的 Node *总值等于1时,就会发生这种情况

编辑3:请注意2412是当前节点和堆栈中已有节点的总值。猜猜下一次迭代发生了什么...... 这不是问题

提示:它崩溃了;(。▲▲▲照亮确认▲▲▲ 可能只是巧合......

PASTEBINS FOR ALL ALL

Zombie.cpp(findPath函数): http://pastebin.com/3YG2Nb2Y

Node.h: http://pastebin.com/nPMQdrrg

Node.cpp: http://pastebin.com/1fC3G9hx

此外, Zombie.cpp 在顶部包含以下内容:

bool compNode::operator() (Node* lhv, Node* rhv) { return lhv->getTotalValue() > rhv->getTotalValue(); }

0 个答案:

没有答案