2011-04-19 32 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