我一直在寻找超过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 );
答案 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)
一些想法:
你怎么知道你有内存泄漏?你有什么迹象?有时任务管理器或top
是不准确的,因为在释放内存时,操作系统可能尚未重新分配。
如果你反复调用这个函数,可能是正在分配_bitmap(使用createBitmap),但它的内存不是free()'d。是否还有“DestroyBitmap”或“FreeBitmap”功能?
答案 4 :(得分:0)
如果_bitmap在createBitmap中已包含另一个图像,则会丢失该指针并泄漏内存。另外,正如您所提到的,您还需要销毁位图。
如果您释放位图,可能值得花些时间找出崩溃的原因,您是否在无意中再次使用指向已释放位图的指针?