2011-04-19 74 views
0

我一直在寻找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

你是否100%确定这是泄漏?尝试暂时评论它,看看它是否真的是泄漏。 – Kaslai 2011-04-19 03:17:22

+0

你对'_bitmap'泄漏的直觉对我来说似乎是正确的。 – msandiford 2011-04-19 03:19:00

回答

1

假设createbitmap分配内存,你覆盖_bitmap始终,当你调用updateBitmap()? (是否有任何声明丢失,无法管理_bitmap?)

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

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

提供我试图设置_bitmap为0之前删除,然后创建一个新的位图,而不是它没有崩溃,但内存泄漏仍然存在 – Johnathan 2011-04-19 03:26:31

+0

不要设置_bitmap在删除之前为'0'。只需查看我上面编辑的答案。 – iammilind 2011-04-19 03:33:15

+0

在删除或释放它之前,不需要检查NULL。 – 2011-04-19 03:38:21

1

那么你需要删除的东西,当你在堆上创建它们。这听起来像你需要删除_bitmap,但只有你以前使用它;如果你在尝试删除它之前没有设置它,它会崩溃。

0

的一点想法:

  1. 你怎么知道你有内存泄漏?你对此有何指示?有时候任务管理器或者top是不准确的,因为当内存被释放时,它可能还没有被操作系统重新分配。

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

+0

1)我知道它的内存泄漏,因为我注释掉了这个函数并查看了内存。它是稳定的,然后我把这个函数循环了10000次,我有170MB的ram占用了,之后没有减少。2)只有一个删除功能由allegro – Johnathan 2011-04-19 03:22:50

0

如果当你创建位图时_bitmap已经包含另一个图像,你将失去该指针和泄漏内存。另外,正如你所提到的,你也需要销毁位图。

如果你释放位图,它可能是值得你花时间找出它崩溃的原因的,你是否会无意中重新使用指向释放位图的指针?

+0

是的,我打算为我创建的新位图使用相同的指针。 – Johnathan 2011-04-19 03:28:24

1

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

al_create_bitmap()是。

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

+0

已更新的答案。 createBitmap的签名是什么?您可能调用错误的函数来释放位图。 – karlphillip 2011-04-19 03:38:39