5264|18

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

100分查内存泄漏 [复制链接]



  1. bool CGPSGuidsDlg::InitMap(const WCHAR* fileName)
  2. {
  3.         IImagingFactory*        pImagingFactory;
  4.         IImage*                                pImage;
  5.         ImageInfo                        imageInfo;

  6.         HBITMAP                                hBitmap;
  7.         CDC*                                hDC = GetDC();

  8.         ASSERT(hDC != NULL);

  9.         HRESULT                                hr;

  10.         bool rs = false;
  11.        


  12.         if (SUCCEEDED(hr = CoInitializeEx(NULL, COINIT_MULTITHREADED)))
  13.         {
  14.                 if (SUCCEEDED(hr = CoCreateInstance(CLSID_ImagingFactory,NULL,
  15.                                                                                         CLSCTX_INPROC_SERVER,
  16.                                                                                         IID_IImagingFactory,
  17.                                                                                         (void**)&pImagingFactory)))
  18.                 {
  19.                         if (SUCCEEDED(hr = pImagingFactory->CreateImageFromFile(fileName, &pImage)))
  20.                         {

  21.                                 pImage->GetImageInfo(&imageInfo);
  22.                                 hBitmap = CreateCompatibleBitmap(hDC->GetSafeHdc(), imageInfo.Width, imageInfo.Height);            //这里申请了很大内存并没有释放掉...
  23.                                 /*hDC->DeleteDC()*/
  24.                                 //DeleteCompatibleBitmap(hBitmap);
  25.                                 DeleteDC(m_hMemDC);
  26.                                 m_hMemDC = CreateCompatibleDC(hDC->GetSafeHdc());
  27.                                 SelectObject(m_hMemDC, hBitmap);

  28.                                 m_rcMem.left = 0;
  29.                                 m_rcMem.top = 0;
  30.                                 m_rcMem.right = imageInfo.Width;
  31.                                 m_rcMem.bottom = imageInfo.Height;
  32.                                
  33.                                 //draw the img to mem
  34.                                 pImage->Draw(m_hMemDC, &m_rcMem, NULL);

  35.                                 //大地图和小地图之间的比例
  36.                                 m_nImageWidth = imageInfo.Width;
  37.                                 m_nImageHeight = imageInfo.Height;

  38.                                 rs = true;
  39.                         }
  40.                 }
  41.         }

  42.         DeleteObject(&hr);
  43.         DeleteObject(hBitmap);
  44.         DeleteObject(&imageInfo);

  45.         if (pImagingFactory != NULL)
  46.         {
  47.                 pImagingFactory->Release();
  48.                 pImagingFactory = NULL;
  49.         }
  50.        
  51.         if (pImage != NULL)
  52.         {
  53.                 pImage->Release();
  54.                 pImage = NULL;
  55.         }
  56.        
  57.         CoUninitialize();
  58.         if (hDC != NULL)
  59.         {
  60.                 ReleaseDC(hDC);
  61.                 DeleteObject(hDC);
  62.         }
  63.         return rs;
  64. }


复制代码

最新回复

已解决...  选出再删除...  详情 回复 发表于 2009-11-7 00:40
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
晕 ~

最好自己一步一步调试执行,如果有问题,肯定可以找不出来
这样要是能看出来,要调试器还啥用
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
那几个指针都关掉了啊。俺等着高手们的解答,顺便学习。
————————————————————————————————————————————————
现阶段连菜鸟都算不上,我就是来顶贴学习的。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 zhaoyw_1127 的回复:
晕 ~

最好自己一步一步调试执行,如果有问题,肯定可以找不出来
这样要是能看出来,要调试器还啥用

多了个“不”字
~ ~
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

5
 
SelectObject(m_hMemDC, hBitmap);


选进去了。。没有选出来。。。选出来再删除m_hMemDC
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
m_hMemDC
    这个需要使用的
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 zhengchao109 的回复:
m_hMemDC
? ? 这个需要使用的


选出了么?
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

8
 
Oldbitmap = ( HBITMAP )SelectObject(m_hMemDC, hBitmap);

SelectObject(m_hMemDC, Oldbitmap );
DeleteObject(hBitmap);

 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
SelectObject(m_hMemDC, hBitmap);
这错了,没有SELECT回去
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

10
 
不是很明...   可否明白点
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

11
 
Oldbitmap   这个还要删除吗?
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

12
 
m_hMemDC,就算要用,每次用完总要free下啊
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

13
 
删除了 图片显示不了...

我是用这个来不断地更换读取图片...
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

14
 
把MAP文件打开....看出错的时候的提示信息!
根据PC所指的地址一步一步找!
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 12 楼 dthxman 的回复:
m_hMemDC,就算要用,每次用完总要free下啊


        CPaintDC dc(this);
        HDC        hDC;
                       
        hDC = dc.GetSafeHdc();
        StretchBlt(hDC,
                0,
                0,
                m_nScreenWidth,
                m_nScreenHeight,
                m_hMemDC,
                m_nCurrentPostionX,         //m_rcMem.left,
                m_nCurrentPostionY,
                m_nCurrentDisplayWidth,
                m_nCurrentDisplayheight,
                SRCCOPY);
       
        m_tc.DrawMainMenu(&dc);       
        ::DeleteDC(hDC);


我在这里用 怎样释放?
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 15 楼 zhengchao109 的回复:
引用 12 楼 dthxman 的回复:
m_hMemDC,就算要用,每次用完总要free下啊


CPaintDC dc(this);
HDC hDC;

hDC = dc.GetSafeHdc();
StretchBlt(hDC,
0,
0,
m_nScreenWidth,
m_nScreenHeight,
m_hMemDC,
m_nCurrentPostionX,? ? ? ? //m_rcMem.left,
m_nCurrentPostionY,
m_nCurrentDisplayWidth,
m_nCurrentDisplayheight,
SRCCOPY);

m_tc.DrawMainMenu(&dc);
::DeleteDC(hDC);


我在这里用 怎样释放?



不用着急  释放  记得把图片选出来就好了。。。你退出的时候  记得释放就好了
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

17
 
你的问题主要是由于  你没有把图片Slect出来。。造成的内存泄漏

//选入m_hMemDC
Oldbitmap = ( HBITMAP )SelectObject(m_hMemDC, hBitmap);

//选出m_hMemDC
SelectObject(m_hMemDC, Oldbitmap );    //这里你不选出,每次都会加载进去一张图片。

//删除hBitmap
DeleteObject(hBitmap);
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

18
 
先用单步调试找到哪一行代码出问题比较好吧
 
 
 

回复

95

帖子

0

TA的资源

一粒金砂(初级)

19
 
已解决...  选出再删除...
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表