在此代码中找不到内存泄漏

时间:2011-04-19 03:10:37

标签: c++ memory-leaks

我一直在寻找超过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如何管理记忆。使用Allegro,您必须:

al_destroy_bitmap( ALLEGRO_BITMAP* bitmap );

5 个答案:

答案 0 :(得分:1)

当你在堆上创建它们时,你需要删除它们。听起来你需要删除_bitmap,但前提是你曾经使用它;如果你在尝试删除它之前没有将它设置为某种东西,它会崩溃。

答案 1 :(得分:1)

假设createbitmap分配内存,当你拨打_bitmap时,是否总是覆盖updateBitmap()? (管理_bitmap是否缺少任何声明?)

如果_bitmap未初始化并且您正尝试free,则可能会崩溃。您可以在构造函数中将_bitmap初始化为0,然后在释放之前检查NULL。即。

if(_bitmap != 0)
  delete or free (_bitmap); 

答案 2 :(得分:1)

如果我可能完全诚实,createBitmap()不是al_destroy_bitmap()的对应物。

al_create_bitmap()是。

您的createBitmap()可能来自其他地方。检查它的签名。

答案 3 :(得分:0)

一些想法:

  1. 你怎么知道你有内存泄漏?你有什么迹象?有时任务管理器或top是不准确的,因为在释放内存时,操作系统可能尚未重新分配。

  2. 如果你反复调用这个函数,可能是正在分配_bitmap(使用createBitmap),但它的内存不是free()'d。是否还有“DestroyBitmap”或“FreeBitmap”功能?

答案 4 :(得分:0)

如果_bitmap在createBitmap中已包含另一个图像,则会丢失该指针并泄漏内存。另外,正如您所提到的,您还需要销毁位图。

如果您释放位图,可能值得花些时间找出崩溃的原因,您是否在无意中再次使用指向已释放位图的指针?