Возврат указателя на объект из списка - PullRequest
2 голосов
/ 06 января 2012

У меня есть список объектов в классе FutureEvent, куда я хочу иметь возможность отправлять что-то вроде futureEvents.getNextEvent ().В настоящее время это то, что у меня работает, однако, из-за вызова New, я думаю, что это является причиной моей большой утечки памяти.Любая помощь будет принята с благодарностью.Как еще я могу вернуть указатель на следующее событие.Спасибо

EVENT* FutureEvent::getNextEvent()
{
EVENT* nextEvent = new EVENT;
*nextEvent = futureEvents.front();
futureEvents.pop_front();
return nextEvent;
}

1 Ответ

4 голосов
/ 06 января 2012

Если вы не delete результат этой функции где-либо, это, безусловно, является причиной утечки памяти.

Возможные решения включают в себя:

  1. Возврат по значению

    При таком подходе вам даже не нужно использовать динамическое распределение (т. Е. new). Вы используете только автоматические объекты, поэтому вам не нужно очищать: используемая ими память автоматически освобождается, а любые деструкторы вызываются автоматически.

    EVENT FutureEvent::getNextEvent() {
        EVENT nextEvent = futureEvents.front();
        futureEvents.pop_front();
        return nextEvent;
    }
    
  2. Использование умного указателя

    В этом подходе все еще используется динамическое распределение, но он делегирует класс, который может автоматически выполнять очистку.

    std::unique_ptr<EVENT> FutureEvent::getNextEvent() {
        std::unique_ptr<EVENT> nextEvent(new EVENT(futureEvents.front()));
        futureEvents.pop_front();
        return nextEvent;
    }
    

    Если ваш компилятор не поддерживает std::unique_ptr, вы можете использовать один из умных указателей в Boost, например boost::shared_ptr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...