执行以下代码出现内存溢出,请高手指教,谢谢! (表和类绑定,imaObj是绑定的类的一个对象)         if(imaObj.CanAppend())
{
Sleep(2000);
imaObj.AddNew();
CFile file;
if(!file.Open(filename, CFile::modeRead))
{
//AfxMessageBox(_T("Open file ERROR!") + filename);
imaObj.Close();
return 0;
}
CFileStatus fileStatus;
file.GetStatus(fileStatus);//得到打开的图像文件的状态信息;
imaObj.m_data.m_dwDataLength = fileStatus.m_size;
HGLOBAL hGlobal = ::GlobalAlloc(GPTR,fileStatus.m_size);//申请存放图像数据的空间。
if(hGlobal == NULL)
{
//AfxMessageBox(_T("GlobalAlloc fails!"));
file.Close();
imaObj.Close();
return 0;
}
//*************经调试,主要是以下代码导致******************************************************
imaObj.m_data.m_hData = ::GlobalLock(hGlobal);//将该空间付给m_data成员
if(imaObj.m_data.m_hData == NULL)
{
//AfxMessageBox(_T("GlobalLock fails!"));
file.Close();
imaObj.Close();
return 0;
}
CRecordset rs;
rs.AddNew();
file.Read(imaObj.m_data.m_hData,fileStatus.m_size);//向m_data读图像数据.
imaObj.m_filename = name;
imaObj.m_datalength = fileStatus.m_size;
imaObj.SetFieldDirty(&imaObj.m_data);//标志数据库已经修改;
imaObj.SetFieldNull(&imaObj.m_data,FALSE);//设置记录为NULL;
imaObj.Update();//刷新数据库的记录
//*****************如果不执行以上操作,则不出现问题****************************************
imaObj.Close();
file.Close();
file.Remove(filename);
::GlobalUnlock(hGlobal);
::GlobalFree(hGlobal);
hGlobal =NULL;
}

解决方案 »

  1.   

    噢,中间有两行是不要的(即以下两行)
    CRecordset rs; 
    rs.AddNew();
      

  2.   

    你的代码,我还没看明白你代码的意思.CRecordset rs; 
    rs.AddNew(); 
    上面两句在程序中一点作用都没有,你写出来干什么啊.
    一般用ODBC增加记录
    要先Open,再调用AddNew
      

  3.   

    已经OPEN()了。那两行是不要的,谢谢您的关注
      

  4.   

    先定位大概出现溢出时的语句,然后再看是sql语句问题还是数据处理问题等
      

  5.   

    呵呵,谢谢
    不执行以下两句的话不会出现问题
    imaObj.m_data.m_hData = ::GlobalLock(hGlobal);//将该空间付给m_data成员 
    file.Read(imaObj.m_data.m_hData,fileStatus.m_size);//向m_data读图像数据. 
      

  6.   

    真正导致溢出的是这句:imaObj.m_data.m_hData = ::GlobalLock(hGlobal);
    经调试发现imaObj.m_data.m_hData的初始值不为空(0),如果不重新赋值,imaObj关闭时所申请的空间都释放,但重新指派后,每导入一张图片就有小于一张图片大小的空间没有释放(如图片是500K,大概就有450K没有释放)。