我编了一个有关图像识别的MFC程序,在主面板类的按钮消息映射中循环调用一个图像处理类的函数,该函数每执行一次都new一段内存,退出之前delete释放内存。
问题是:我运行程序的时候打开任务管理器,在性能选项卡里监控内存使用情况,发现内存一直猛的上升,最后升到2.7G左右,程序弹出系统提示“内存不足”。但是在任务管理器的进程选项卡里监控该程序所在的进程的内存使用情况是,发现内存一直不变,一直保持在10M左右。
非常着急,请高手指点迷津

解决方案 »

  1.   

    "函数每执行一次都new一段内存,退出之前delete释放内存"具体含义是什么?多次new,一次delete?还是多次new,多次delete?
      

  2.   

    检测函数大概这样:
    CheckPic()
    {
       lpImage = (LPBYTE) new char[lmageWidth*lmageHeight*4];
        ………
         ………
        …………
        delete [] lpImage;
        return;
    }
      

  3.   

    是不是DC之类的东西没有释放?看看任务管理器中GDI对象,USER对象有没有增加
      

  4.   

    把虚拟内存弄出来看看选项-->选择列-->虚拟内存
      

  5.   

    CFile file;
    file.Open("picture\\mysnap.bmp", CFile::modeRead | CFile::shareDenyWrite);
    m_hDIB=m_dib.LoadFile(file);// 调用ReadDIBFile()读取图象
    file.Close();
    if(m_hDIB==NULL)
    {
     AfxMessageBox("读取图象时出错");
     return;
    } // 指向DIB的指针
    LPSTR lpDIB;
    // 指向DIB象素指针
    LPSTR    lpDIBBits;
    // 锁定DIB
    lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) m_hDIB);
    // 找到DIB图像象素起始位置
    lpDIBBits = m_dib.GetBits(lpDIB);
    // 更改光标形状
    BeginWaitCursor();
    //进行处理
    while (1)
    {
    m_carTest.CheckPic(lpDIBBits, m_dib.GetWidth(lpDIB), m_dib.GetHeight(lpDIB),m_pRoadInfo);
    }
    在死循环里的函数基本都没用到什么句柄,应该不是这种问题。
      

  6.   

    lz你的GlobalLock锁定以后,调用GlobalUnlock解锁了吗??
      

  7.   

    有解锁,我没贴出来,我只贴到while(1)那里,我故意让那个函数在死循环里执行。
    CheckPic函数的大概样子我之前已经贴出来了,现在的问题就是虚拟内存一直升,不知道为什么