2017-08-11 7 views
-2

私はVS2015でDirectX11アプリケーションを開発中です。最近、このmsvcp140d.dllライブラリによって発生したランタイムエラーが発生しました。 どのようにmsvcp140d.dllが整数比較にエラーを引き起こす可能性がありますか?

enter image description here

してエラーを生成するコードを以下に示します:エラーが発生したコールスタックは以下のとおりです私の知る限りは、変数の値を言うことができるよう enter image description here

は許容できるものであったので、私は思いますこのコード行でmsvcp140d.dllが壊れた原因を正確に把握できません。このdllが間違っている可能性がありますか?あるいは何かが間違っている?

エラーのある関数は、私のA *アルゴリズムの実装です。

vector<pair<int, int>> NavigationManager::pathFinding(int startX, int startY, int endX, int endY) const{ 
vector<pair<int, int>> path; 
if (startX == endX&&startY == endY) 
    return path; 

Node ***nodeMap = new Node**[mapHeight]; 
for (int i = 0; i<mapHeight; ++i) 
{ 
    nodeMap[i] = new Node*[mapWidth]; 
    for (int j = 0; j<mapWidth; ++j) 
    { 
     if (map[i][j] != 1) { 
      nodeMap[i][j] = new Node(j, i); 
      nodeMap[i][j]->hValue = (abs(endX - j) + abs(endY - i)) * 10; 
     } 
     else 
      nodeMap[i][j] = nullptr; 
    } 
} 

auto comp = [](Node *a, Node *b) {return (a->gValue + a->hValue) > (b->gValue + a->hValue); }; 
priority_queue<Node*, vector<Node*>, decltype(comp)> pq(comp); 
vector<Node*> v; 
int currentX, currentY, currentGValue; 
Node *currentParent = nullptr; 
do 
{ 
    if (pq.empty()) 
    { 
     currentX = startX; 
     currentY = startY; 
     currentGValue = 0; 
    } 
    else 
    { 
     currentParent = pq.top(); 
     currentX = currentParent->x; 
     currentY = currentParent->y; 
     currentGValue = currentParent->gValue; 
     v.push_back(currentParent); 
     pq.pop(); 
    } 
    if (currentX == endX&&currentY == endY) 
     break; 

    if (currentX<mapWidth - 1 && map[currentY][currentX + 1] != 1) 
    { 
     if (nodeMap[currentY][currentX + 1]->gValue == 0) 
     { 
      nodeMap[currentY][currentX + 1]->gValue = currentGValue + 10; 
      nodeMap[currentY][currentX + 1]->parent = currentParent; 
      pq.push(nodeMap[currentY][currentX + 1]); 
     } 
     else if (currentGValue + 10<nodeMap[currentY][currentX + 1]->gValue) 
     { 
      nodeMap[currentY][currentX + 1]->gValue = currentGValue + 10; 
      nodeMap[currentY][currentX + 1]->parent = currentParent; 
     } 
    } 

    if (currentX<mapWidth - 1 && map[currentY][currentX + 1] != 1 && currentY<mapHeight - 1 && map[currentY + 1][currentX] != 1 && map[currentY + 1][currentX + 1] != 1) 
    { 
     if (nodeMap[currentY + 1][currentX + 1]->gValue == 0) 
     { 
      nodeMap[currentY + 1][currentX + 1]->gValue = currentGValue + 14; 
      nodeMap[currentY + 1][currentX + 1]->parent = currentParent; 
      pq.push(nodeMap[currentY + 1][currentX + 1]); 
     } 
     else if (currentGValue + 14<nodeMap[currentY + 1][currentX + 1]->gValue) 
     { 
      nodeMap[currentY + 1][currentX + 1]->gValue = currentGValue + 14; 
      nodeMap[currentY + 1][currentX + 1]->parent = currentParent; 
     } 
    } 

    if (currentY<mapHeight - 1 && map[currentY + 1][currentX] != 1) 
    { 
     if (nodeMap[currentY + 1][currentX]->gValue == 0) 
     { 
      nodeMap[currentY + 1][currentX]->gValue = currentGValue + 10; 
      nodeMap[currentY + 1][currentX]->parent = currentParent; 
      pq.push(nodeMap[currentY + 1][currentX]); 
     } 
     else if (currentGValue + 10<nodeMap[currentY + 1][currentX]->gValue) 
     { 
      nodeMap[currentY + 1][currentX]->gValue = currentGValue + 10; 
      nodeMap[currentY + 1][currentX]->parent = currentParent; 
     } 
    } 

    if (currentX>0 && map[currentY][currentX - 1] != 1 && currentY<mapHeight - 1 && map[currentY + 1][currentX] != 1 && map[currentY + 1][currentX - 1] != 1) 
    { 
     if (nodeMap[currentY + 1][currentX - 1]->gValue == 0) 
     { 
      nodeMap[currentY + 1][currentX - 1]->gValue = currentGValue + 14; 
      nodeMap[currentY + 1][currentX - 1]->parent = currentParent; 
      pq.push(nodeMap[currentY + 1][currentX - 1]); 
     } 
     else if (currentGValue + 14<nodeMap[currentY + 1][currentX - 1]->gValue) 
     { 
      nodeMap[currentY + 1][currentX - 1]->gValue = currentGValue + 14; 
      nodeMap[currentY + 1][currentX - 1]->parent = currentParent; 
     } 
    } 

    if (currentX>0 && map[currentY][currentX - 1] != 1) 
    { 
     if (nodeMap[currentY][currentX - 1]->gValue == 0) 
     { 
      nodeMap[currentY][currentX - 1]->gValue = currentGValue + 10; 
      nodeMap[currentY][currentX - 1]->parent = currentParent; 
      pq.push(nodeMap[currentY][currentX - 1]); 
     } 
     else if (currentGValue + 10<nodeMap[currentY][currentX - 1]->gValue) 
     { 
      nodeMap[currentY][currentX - 1]->gValue = currentGValue + 10; 
      nodeMap[currentY][currentX - 1]->parent = currentParent; 
     } 
    } 

    if (currentX>0 && map[currentY][currentX - 1] != 1 && currentY>0 && map[currentY - 1][currentX] != 1 && map[currentY - 1][currentX - 1] != 1) 
    { 
     if (nodeMap[currentY - 1][currentX - 1]->gValue == 0) 
     { 
      nodeMap[currentY - 1][currentX - 1]->gValue = currentGValue + 14; 
      nodeMap[currentY - 1][currentX - 1]->parent = currentParent; 
      pq.push(nodeMap[currentY - 1][currentX - 1]); 
     } 
     else if (currentGValue + 14<nodeMap[currentY - 1][currentX - 1]->gValue) 
     { 
      nodeMap[currentY - 1][currentX - 1]->gValue = currentGValue + 14; 
      nodeMap[currentY - 1][currentX - 1]->parent = currentParent; 
     } 
    } 

    if (currentY>0 && map[currentY - 1][currentX] != 1) 
    { 
     if (nodeMap[currentY - 1][currentX]->gValue == 0) 
     { 
      nodeMap[currentY - 1][currentX]->gValue = currentGValue + 10; 
      nodeMap[currentY - 1][currentX]->parent = currentParent; 
      pq.push(nodeMap[currentY - 1][currentX]); 
     } 
     else if (currentGValue + 10<nodeMap[currentY - 1][currentX]->gValue) 
     { 
      nodeMap[currentY - 1][currentX]->gValue = currentGValue + 10; 
      nodeMap[currentY - 1][currentX]->parent = currentParent; 
     } 
    } 

    if (currentX<mapWidth - 1 && map[currentY][currentX + 1] != 1 && currentY>0 && map[currentY - 1][currentX] != 1 && map[currentY - 1][currentX + 1] != 1) 
    { 
     if (nodeMap[currentY - 1][currentX + 1]->gValue == 0) 
     { 
      nodeMap[currentY - 1][currentX + 1]->gValue = currentGValue + 14; 
      nodeMap[currentY - 1][currentX + 1]->parent = currentParent; 
      pq.push(nodeMap[currentY - 1][currentX + 1]); 
     } 
     else if (currentGValue + 14<nodeMap[currentY - 1][currentX + 1]->gValue) 
     { 
      nodeMap[currentY - 1][currentX + 1]->gValue = currentGValue + 14; 
      nodeMap[currentY - 1][currentX + 1]->parent = currentParent; 
     } 
    } 
} while (!pq.empty()); 

if (v.size() == 0 || v[v.size() - 1]->x != endX || v[v.size() - 1]->y != endY) 
    return path; 

stack<pair<int, int>> s; 
if (!v.empty()) 
{ 
    Node *destination = v[v.size() - 1]; 
    while (destination) 
    { 
     s.push(pair<int, int>(destination->x, destination->y)); 
     destination = destination->parent; 
    } 
} 
while (!s.empty()) 
{ 
    path.push_back(s.top()); 
    s.pop(); 
} 
for (int i = 0; i<mapHeight; ++i) 
{ 
    for (int j = 0; j<mapWidth; ++j) 
    { 
     delete nodeMap[i][j]; 
    } 
    delete[] nodeMap[i]; 
} 
delete[] nodeMap; 

return path; 

}

+0

このライブラリはC++ランタイムライブラリであり、問​​題はほとんどありません。あなた自身のコードで問題を探します。 – SergeyA

+0

Line 81は、呼び出された関数が返されたときにこの関数の実行が再開する場所です。可能であれば 'pq.pop();'コードをスクリーンショットではなくコードとして投稿します。 – 1201ProgramAlarm

答えて

0

あなたのプライオリティキュー内のオブジェクトのソート・キーを変更しています。

典型的なケースを見ると、ノードのgValueがゼロの場合は、それをgValueに割り当て、それを優先キューに(ポインタを)追加します。その後、ノードが依然として優先待ち行列にある間に、gValueを変更する可能性があります。これにより、並べ替え順序がすべて乱され、コンテナが依存している順序が破られ、次に何が起きるかが分かります。このため、priority_queue::top()はconst参照を返します。

すでにpqにある要素を変更する必要がある場合は、削除して値を変更してから追加する必要があります。

関連する問題