Не удается найти утечку памяти в этом коде - PullRequest
0 голосов
/ 19 апреля 2011

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

void WidgetLabel::updateBitmap( Display* display )
{

    Size textSize = getTextSize( _font, _text.c_str() );

    _bitmap = createBitmap( textSize.getWidth(), textSize.getHeight(), display );

    startDrawingToBitmap( _bitmap );
        drawText( _font, _color, Point(0,0), _text.c_str() );
    stopDrawingToBitmap( _bitmap, display );

}

Редактировать: Я подумал, что мне может понадобиться удалить _bitmap, чтобы освободить место перед созданием нового, но при этом приложение продолжает падать. Я предполагаю, что это из-за того, как Аллегро управляет памятью. С Allegro вы должны сделать:

al_destroy_bitmap( ALLEGRO_BITMAP* bitmap );

Ответы [ 5 ]

1 голос
/ 19 апреля 2011

Если честно, createBitmap() не является аналогом al_destroy_bitmap().

al_create_bitmap() есть.

Ваш createBitmap () мог прийти откуда-то еще. Проверьте его подпись.

1 голос
/ 19 апреля 2011

Предполагая, что createbitmap выделяет память, вы всегда перезаписываете _bitmap, когда вызываете updateBitmap()? (Есть ли какое-то утверждение, которое вам не хватает для управления _bitmap?)

Может произойти сбой, если _bitmap не инициализирован и вы пытаетесь free его. Вы можете инициализировать _bitmap в конструкторе как 0, а затем проверить NULL перед его освобождением. т.е.

if(_bitmap != 0)
  delete or free (_bitmap); 
1 голос
/ 19 апреля 2011

Ну, вам нужно удалить вещи, когда вы создаете их в куче.Похоже, вам нужно удалить _bitmap, но только если вы использовали его ранее;он вылетел бы, если бы вы не установили что-либо до того, как попытаетесь удалить его.

0 голосов
/ 19 апреля 2011

Если _bitmap уже содержит другое изображение, когда вы создаете Bitmap, вы потеряете этот указатель и потеряете память. Кроме того, как вы упомянули, вам также необходимо уничтожить растровое изображение.

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

0 голосов
/ 19 апреля 2011

Несколько мыслей:

  1. Откуда вы знаете, что у вас утечка памяти?Что вы указываете на это?Иногда диспетчер задач или top являются неточными, поскольку, хотя память была освобождена, она еще не может быть перераспределена ОС.

  2. Если вы вызываете эту функциюнеоднократно может случиться так, что _bitmap выделяется (используя createBitmap), но его память не освобождается () 'd.Есть ли также функция «DestroyBitmap» или «FreeBitmap»?

...