2016-07-21 15 views
-3

以下のコードでは、assert文が動作しています(falseになります)。しかし、配列にアクセスする並列スレッドはありません。実際、並列コードはまったくありません。私は、ビジュアルスタジオの中で関数の開始時にラインを運ぶと正しく動作します。何が問題を引き起こす可能性がありますか?私は何らかの理由を見ることができません。std ::境界外のベクトル

void CheckProjectileMeteorCollision() 
    { 
    int i = ((int)m_meteorManager.m_meteors.size() - 1); 
    for (i; i > -1; i--) 
    { 
     int j = ((int)m_projectileManager.m_projectiles.size() - 1); 
     for (j; j > -1; j--) 
     { 
     assert(i != m_meteorManager.m_meteors.size()); 

     if (SpherePointIntersection(
      m_meteorManager.m_meteors[i]->m_node->m_translation, 
      m_meteorManager.m_meteors[i]->m_collisionRadius, 
      m_projectileManager.m_projectiles[j]->m_node->m_translation)) 
     { 
      SafeDel(m_projectileManager.m_projectiles[j]); 
      m_projectileManager.m_projectiles.erase(m_projectileManager.m_projectiles.begin() + j); 

      SafeDel(m_meteorManager.m_meteors[i]); 
      m_meteorManager.m_meteors.erase(m_meteorManager.m_meteors.begin() + i); 
     } 
     } 
    } 

    } 
+1

最小限の完全な例を書こうとしましたか?誰か他の人がコンパイルして実行できるもの? – Jens

+0

'SafeDelは恐らく安全ではないでしょう。 – LogicStuff

+0

残念ながら、私は "SafeDel"行を削除します。まだ問題が発生しています。このコードに論理的な問題が含まれていない場合は、私のためにokです。問題は他にどこかにある。 – Cihan

答えて

0

多分、次の問題があります。内部ループ(for J)は、m_meteorの1つ以上の要素を削除することがあります。そうであれば、内側のループは、外側のループが通過するよりも速く、外側のループの要素(Iの場合)をさらに速く消去します。

+0

非常に巧妙な答え、これは私が逃したものでした。ありがとうございました ! – Cihan

関連する問題