前言
我正在尝试修复我遇到的崩溃,因此我在调试模式下运行了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 *被推入:
我听说如果我直接修改堆会发生这种情况,但我不记得这样做了。如果您需要更多代码,请提及它。
谢谢!
编辑:我注意到,当openList(位置0)顶部的项目和节点具有相同的总值时,我收到此错误。堆是不是能够包含两个相同的键值?我可以创建一个在其子节点之间具有> =关系的堆而不是>关系。
编辑2:我已将所有内容更改为 std :: priority_queue ,它使用的是使用">"运营商进行比较。我仍然得到错误。 我几乎可以肯定,当* std :: priority_queue *
编辑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(); }