100分查内存泄漏

haian_bch   2009-11-6 15:04 楼主


  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. }


回复评论 (18)

晕 ~

最好自己一步一步调试执行,如果有问题,肯定可以找不出来
这样要是能看出来,要调试器还啥用
点赞  2009-11-6 15:09
那几个指针都关掉了啊。俺等着高手们的解答,顺便学习。
————————————————————————————————————————————————
现阶段连菜鸟都算不上,我就是来顶贴学习的。
点赞  2009-11-6 15:09
引用: 引用 1 楼 zhaoyw_1127 的回复:
晕 ~

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

多了个“不”字
~ ~
点赞  2009-11-6 15:13
SelectObject(m_hMemDC, hBitmap);


选进去了。。没有选出来。。。选出来再删除m_hMemDC
点赞  2009-11-6 15:13
m_hMemDC
    这个需要使用的
点赞  2009-11-6 15:36
引用: 引用 5 楼 zhengchao109 的回复:
m_hMemDC
? ? 这个需要使用的


选出了么?
点赞  2009-11-6 15:41
Oldbitmap = ( HBITMAP )SelectObject(m_hMemDC, hBitmap);

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

点赞  2009-11-6 15:44
SelectObject(m_hMemDC, hBitmap);
这错了,没有SELECT回去
点赞  2009-11-6 15:47
不是很明...   可否明白点
点赞  2009-11-6 15:50
Oldbitmap   这个还要删除吗?
点赞  2009-11-6 15:51
m_hMemDC,就算要用,每次用完总要free下啊
点赞  2009-11-6 16:03
删除了 图片显示不了...

我是用这个来不断地更换读取图片...
点赞  2009-11-6 16:08
把MAP文件打开....看出错的时候的提示信息!
根据PC所指的地址一步一步找!
点赞  2009-11-6 16:17
引用: 引用 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);


我在这里用 怎样释放?
点赞  2009-11-6 16:21
引用: 引用 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);


我在这里用 怎样释放?



不用着急  释放  记得把图片选出来就好了。。。你退出的时候  记得释放就好了
点赞  2009-11-6 17:05
你的问题主要是由于  你没有把图片Slect出来。。造成的内存泄漏

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

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

//删除hBitmap
DeleteObject(hBitmap);
点赞  2009-11-6 17:10
先用单步调试找到哪一行代码出问题比较好吧
点赞  2009-11-6 19:48
已解决...  选出再删除...
点赞  2009-11-7 00:40
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复