Попытка удалить указатели в списке приводит к постоянному росту использования памяти - PullRequest
0 голосов
/ 29 ноября 2011

Я думаю, что я пытаюсь использовать неправильный подход, поэтому, пожалуйста, скажите мне, если то, что я пытаюсь достичь, не будет работать с этой "техникой".

У меня есть объект с именем Spawner, который порождает KillerObjectsкаждые X мс, когда я хочу, чтобы объект KillerObject был уничтожен, я вызываю:

void Spawner::RemoveKillerObject(KillerObject* removeThis)
{
    garbageList.push_back(removeThis);
}

Затем каждый раз, когда обновляется Spawner, он будет циклически перебирать список мусора, чтобы удалить каждый объект, который был помещен в список мусора, напримерthis:

 void Spawner::Update(float elapsedTime)
 {
     elapsedSince += elapsedTime;
     if (elapsedSince > spawnRate)
     {
        Spawn();
        elapsedSince = 0;
     }
     for each (KillerObject* removeThis in garbageList)
     {
         spawnedObjects.remove(removeThis);
     }
     garbageList.clear();

     for each (KillerObject* ko in spawnedObjects)
     {
            ko->Update(elapsedTime);
     }
 }

Spawn просто создает указатель на объект KillerObject и помещает его в список spawnedObject.

Объекты «удаляются» в игре, так как в «Я не могу столкнуться»с ними, и они не будут нарисованы.Но это приводит к постоянному росту использования моей памяти, я знаю, что это является причиной, потому что, если я удаляю этот код, использование памяти остается стабильным.

Точка в правильном направлении или любая другая помощь очень ценятся.

С уважением

Маркус

Ответы [ 3 ]

4 голосов
/ 29 ноября 2011

Может быть, вы на самом деле не удаляете объекты? Вы удаляете их из списка, но я нигде не вижу оператора удаления ...?

2 голосов
/ 29 ноября 2011

Удаление указателя не приведет к удалению объекта, на который он указывает. Вот несколько вариантов для рассмотрения:

1) Хранить умные указатели вместо стандартных указателей

2) Удалите объект, прежде чем удалить его из spawnedObjects

3) Вместо этого * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1011* * * * * * * *1011* *1011*.

0 голосов
/ 29 ноября 2011

Должен признать, что я не полностью понял ваш код, но у вас, вероятно, есть утечка памяти, т.е. выдается больше объектов new KillerObject(), чем вы deleteВы можете использовать аналогичный оператор где-нибудь, чтобы удалить ненужные объекты:

for (std::list<KillerObject*>::iterator it = garbageList.begin(); it != garbageList.end(); ++it) {
  delete (*it);
}
garbageList.clear();

или просто изменить:

void Spawner::RemoveKillerObject(KillerObject* removeThis)
{
  delete removeThis;
  //garbageList.push_back(removeThis);
  // todo: add code to remove the pointer from the list
  removeThis = NULL;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...