【问题标题】:Heap corruption when deleting HBITMAP object删除 HBITMAP 对象时堆损坏
【发布时间】:2013-01-23 09:13:21
【问题描述】:

我编写了这段代码来在 MFC 程序(Visual Studio 2010 中的 C++)中将位图打印到我的对话框中:

//Loop start
{
    //...
    //some prep stuff
    //...

    HBITMAP hBmp = myObv->GetBMP();
    CBitmap bmp;
    bmp.Attach(hBmp);
    CClientDC dc(this);
    CDC bmDC;
    bmDC.CreateCompatibleDC(&dc);
    CBitmap *pOldbmp = bmDC.SelectObject(&bmp);
    BITMAP  bi;
    bmp.GetBitmap(&bi);
    dc.BitBlt(384,26,bi.bmWidth/3,bi.bmHeight,&bmDC,0,0,SRCCOPY);
    bmDC.SelectObject(pOldbmp);

}

这很好用,只是随着我不断运行程序并绘制更多位图,程序非常迅速(线性地)开始消耗我的可用内存:

显然快速下降是我关闭程序。

但是当我尝试删除一些对象以阻止内存泄漏时,我的程序崩溃了。

例如:如果我这样做了

    delete hBmp;

我得到错误:

或者如果我删除 pOldbmp,我会收到错误:

如果我在循环之外声明这些对象并继续重复使用它们,我会收到致命的中止错误:

怎么了??

为什么我不能删除这些对象?

【问题讨论】:

  • 不要delete hBmp - 你不是从new 那里得到的吗?请改用DeleteOBject(hBmp)

标签: c++ object mfc heap-corruption


【解决方案1】:

请改用DeleteObject(hBmp)

发生这种情况是因为您在尝试delete hBmp 时仍然使用SelectObject() 选择了它。

【讨论】:

  • 这对除 BITMAP bi 之外的所有人都有效。有没有其他方法可以删除那个?
  • bi 是一个栈对象,当你的函数返回时它会被自动删除。 @xcdemon05
  • 这可能是内存泄漏的根源,因为这一切都发生在无限循环中?这是否意味着它永远不会被删除?
  • 等待不,当循环结束时,堆栈对象BITMAP bi无论如何都会被删除。
  • 所以为了澄清,每次循环运行都会删除 bi?
猜你喜欢
  • 2013-06-04
  • 2013-04-20
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
相关资源
最近更新 更多