2016-07-21 139 views
-3

在下面的代碼中,assert語句正在工作(變爲false)。但是沒有任何並行線程訪問數組。實際上根本沒有任何並行代碼。當我在該函數的開始處攜帶該行(在Visual Studio中)時,它可以正常工作。什麼可能導致問題?我看不出任何理由。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」行。仍然存在問題。如果這段代碼不包含任何對我來說合適的邏輯問題。問題在於其他地方。 – Cihan

回答

0

也許存在以下問題:內循環(對於J)可能會刪除多於m_meteor的一個元素。如果是這樣,則內循環將比外循環更快地擦除外循環(對於I)的元素。

+0

非常聰明的答案,這是我錯過了。謝謝 ! – Cihan