由于項目需要,程序界面中要實現了一個縮略圖顯示控件,從CodeProject上查找到了一個類似的例子(原標題為:Showing the Image file thumbnail view in ListView control using VC++ 6.0 By Karpaga Rajan.),修改了一下,其中源代碼中加入代碼如下:
// 查找某個文件夾下的圖片文件(假如全是BMP)
HBITMAP hBitmap = LoadPicture( finder.GetFilePath() );
if ( hBitmap != NULL )
{
int nItem = GetItemCount();
CBitmap *pBitmap = new CBitmap();
pBitmap->Attach( hBitmap );
int nImage = m_ImageList.Add( pBitmap, RGB( 255, 255, 255 ) );
InsertItem( nItem, finder.GetFileTitle(), nImage );
}
第一次寫完后,就很郁悶,上面new了一個CBitmap,卻沒有在任何地方delete,今天決定解決程序中的內存泄露問題,所以就找到了這塊,原本以為CImageList會提供一個讓人很愉快的解決方案,不過看了下它的成員函數,這才發(fā)現沒那么容易。
第一次嘗試:加入DeleteImageList
在構的CListCtrl析構函數中加入 m_cImageList.DeleteImageList,然后將內存泄露的輸出信息保存為TXT文件,用UE對比了一個,還是沒有解決。
第二次嘗試:重組一個CBitmap*,
既然CImageList.Add時加入的是一個CBitmap*,而通過調用CImageList::GetImageInfo就可能取得某一項的Info,那個結構體中就有HBITMAP,好,我得到了HBITMAP,就可以借由CBitmap::FromHanle來得到這個指針,然后DeleteObject,再delete,結構當我再次查看泄露信息時,結果仍然是失敗。
第三次嘗試:借用指針
既然CImageList::Add的時候存放的是個指針,我就可以用外部指針來持有,這樣兩個指針指向同一個對象,只要小心設計,不就可以解決了?由于CImageList中加入了很多圖片(我的測試用例是38張BMP),這樣我就需要用集合類來存儲指針。
// 查找某個文件夾下的圖片文件(假如全是BMP)
HBITMAP hBitmap = LoadPicture( finder.GetFilePath() );
if ( hBitmap != NULL )
{
int nItem = GetItemCount();
CBitmap *pBitmap = new CBitmap();
pBitmap->Attach( hBitmap );
int nImage = m_ImageList.Add( pBitmap, RGB( 255, 255, 255 ) );
InsertItem( nItem, finder.GetFileTitle(), nImage );
}
第一次寫完后,就很郁悶,上面new了一個CBitmap,卻沒有在任何地方delete,今天決定解決程序中的內存泄露問題,所以就找到了這塊,原本以為CImageList會提供一個讓人很愉快的解決方案,不過看了下它的成員函數,這才發(fā)現沒那么容易。
第一次嘗試:加入DeleteImageList
在構的CListCtrl析構函數中加入 m_cImageList.DeleteImageList,然后將內存泄露的輸出信息保存為TXT文件,用UE對比了一個,還是沒有解決。
第二次嘗試:重組一個CBitmap*,
既然CImageList.Add時加入的是一個CBitmap*,而通過調用CImageList::GetImageInfo就可能取得某一項的Info,那個結構體中就有HBITMAP,好,我得到了HBITMAP,就可以借由CBitmap::FromHanle來得到這個指針,然后DeleteObject,再delete,結構當我再次查看泄露信息時,結果仍然是失敗。
第三次嘗試:借用指針
既然CImageList::Add的時候存放的是個指針,我就可以用外部指針來持有,這樣兩個指針指向同一個對象,只要小心設計,不就可以解決了?由于CImageList中加入了很多圖片(我的測試用例是38張BMP),這樣我就需要用集合類來存儲指針。

