CImageList内存泄露解决方法转,很好 内存泄露解决

CImageList内存泄露解决方法(转,很好) 内存泄露解决
由于项目需要,程序界面中要实现了一个缩略图显示控件,从CodeProject上查找到了一个类似的例子(原标题为:Showing theImage file thumbnail view in ListView control using VC++ 6.0 ByKarpaga 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会提供一个让人很愉快的解决方案,不过看了下它的成员函数,这才发现没那么容易。第一次尝试:加入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),这样我就需要用集合类来存储指针。typedefCArray<CBitmap*, CBitmap* > CBitmapArray;// 查找某个文件夹下的图片文件(假如全是BMP)HBITMAP hBitmap = LoadPicture( finder.GetFilePath() );if ( hBitmap != NULL ){int nItem = GetItemCount();CBitmap *pBitmap = new CBitmap();pBitmap->Attach( hBitmap );m_arrBitmaps.Add(pBitmap );int nImage = m_ImageList.Add( pBitmap, RGB( 255, 255, 255 ));InsertItem( nItem, finder.GetFileTitle(), nImage );}看到了吧,现在有了刚才new出来的指针的集合对象,就可以在重新载入缩略图或退出实例时将数组遍历一次,然后个个delete,再一看,泄露没了。提示:从图中可以看到,每两行描述了一个内存泄露,我用( 最末行 - 最初行 + 1 )/ 2获取结果为:38然后打开图片目录,全选一看,呵,还真38个文件。这是用UE比较的结果,左边为泄露图

右边为使用方法三后的无泄露图。

  

爱华网本文地址 » http://www.413yy.cn/a/25101013/152206.html

更多阅读

教你一招:将手机的铃声变大的方法,很好用!

首先通过“千千静听”,把文件转换为wav格式,然后用Windows录音机(开始→程序→附件→娱乐→录音机)打开该wav文件,在菜单中选择“增大音量”,直到符合你的要求然后保存,再次使用千千静听转换为mp3,这样方法简单而且不会有失真,我经常使用这

黑之契约者第二季呢~很好啊! 黑之契约者第二季

今天一口气把新出的这五集看完了,很好啊~还是很萌~黑的造型有点变化,留了胡子哟~!第二季的名字,《DARKER THAN BLACK-流星的双子-ジェミニ》。双胞胎的爱~~~~~很好啊~~~~黑的能力没有了,还没有讲能力恢复。但是个人觉得能力一定会回来

opencv中Mat使用,很好,顶! opencv mat at

(一)Mat矩阵中数据指针Mat.data是uchar类型指针,CV_8U系列可以通过计算指针位置快速地定位矩阵中的任意元素。二维单通道元素可以用Mat::at(i, j)访问,i是行序号,j是列序号。但对于多通道的非unsigned char类型矩阵来说,以上方法都不好(注:

有点悟的座右铭大全,很好的鼓励语句 鼓励人的经典语句

一个有信念者所开发出的力量,大于99个只有兴趣者。忍耐力较诸脑力,尤胜一筹。环境不会改变,解决之道在于改变自己。如果你希望成功,以恒心为良友,以经验为参谋,以小心为兄弟,以希望为哨兵。人生伟业的建立,不在能知,乃在能行。一个人最大的破

声明:《CImageList内存泄露解决方法转,很好 内存泄露解决》为网友小心眼分享!如侵犯到您的合法权益请联系我们删除