LPBITMAPINFOHEADER m_lpBMPHdr;m_lpBMPHdr = (LPBITMAPINFOHEADER)GlobalLock((HGLOBAL) hdib);
::GlobalUnlock((HGLOBAL) hdib);if (m_lpBMPHdr != NULL)
{
delete[] m_lpBMPHdr;
m_lpBMPHdr = NULL;
}当执行delete时就报错了。错误提示:User breakpoint called from code at 0x7c921970.

解决方案 »

  1.   

    GlobalLock的对象是是GlobalAlloc分配出来的,只能用GlobalFree来释放
    不能用delete来处理
    GlobalLock后,只是给予了你对内存的访问权限,但是没有给你释放的权限
      

  2.   

    不好意思,我的程序当中,首先m_lpBMPHdr是NULL,是执行过一次Global以后,才释放的。实际的代码顺序是下面这样的:if (m_lpBMPHdr != NULL)
    {
    delete[] m_lpBMPHdr;
    m_lpBMPHdr = NULL;
    }
    m_lpBMPHdr = (LPBITMAPINFOHEADER)GlobalLock((HGLOBAL) hdib);
    ::GlobalUnlock((HGLOBAL) hdib);
    这个过程执行后,我都用GlobalFree释放了hdib,这种情况下报错的。不知要怎样改进
      

  3.   

    一个new一个delete
    没有new就没有delete
    就象坐沙发那位说的
      

  4.   

    没有new就没有delete精彩
    楼上说的对
    new和delete配对
    malloc和free配对
    GlobalAlloc和GlobalFree配对
      

  5.   

    LPBITMAPINFOHEADER m_lpBMPHdr = NULL;
      

  6.   

    LPBITMAPINFOHEADER m_lpBMPHdr = NULL;这样做其实并没有释放掉内存,其实我觉得这个对象在这里是不需要释放的,当它超出了它的作用域会自行释放。
      

  7.   

    楼上显然误解。
    在一个类中,如果不将指针初试化为NULL,那么在析构时:
    if (m_lpBMPHdr != NULL)
    {
    delete[] m_lpBMPHdr;
    m_lpBMPHdr = NULL;
    }
    这样的判断语句肯定是非法的.因为即使有new语句配对,但没有执行new操作的话,一样发生异常(例如没有打开图片),所以...
    将一个指针初始化为NULL是一个很好的习惯,会避免不必要的麻烦.