這是我製作的一個簡單遊戲中的一段代碼。這個例程檢查數組中的每個子彈或敵人,如果它們已經經過了屏幕,則將它們從數組中移除。 (此代碼使用SDL2,但我不認爲它很重要。)這段代碼有什麼問題?似乎指針突然指向空值
void cleanEnemies(Enemy* a[], int* s)
{
Enemy* e;
for (int i = 0; i < *s; i++)
{
e = a[i];
if (e->getX() < -75)
{
e->~Enemy();
e = NULL;
for (int j = i; j < *s; j++)
{
a[j] = a[j + 1];
}
(*s)--;
}
}
printf("Enemy count: %i\n", *s);
}
void cleanMissiles(HomingMissile* a[], int* s)
{
HomingMissile* m;
for (int i = 0; i < *s; i++)
{
m = a[i];
if (m->getX() < -75)
{
m->~HomingMissile();
m = NULL;
for (int j = i; j < *s; j++)
{
a[j] = a[j + 1];
}
(*s)--;
}
}
printf("Missile count: %i\n", *s);
}
運行程序產生指向無效的內存位置的指針。任何人都可以告訴我我做錯了什麼?謝謝。
爲什麼你明確地打電話給t他析構函數在'm->〜HomingMissile();'而不是使用'delete'? – BlackDwarf
同上'e->〜Enemy()'?同時指定哪些指針指向無效的內存位置會有所幫助。沒有獨立的例子就很難調試。也許析構函數有副作用? – abligh
'std :: vector'和* erase remove idiom *可能有幫助。 – Jarod42