CFile指针对象m_pFile Close之后,delete时崩溃

Tiger-3D 2014-04-16 05:20:52
	if(m_pFile != NULL)
{
m_pFile->Close();
delete m_pFile;
m_pFile = NULL;
}
m_pFile是new出来的,也打开文件了,这些步骤是没有出问题的。使用完这个文件之后,到上面代码中的delete这步时挂掉了,程序指向了degheap.c中的这行代码:
  /* Error if freeing incorrect memory type */
_ASSERTE(pHead->nBlockUse == nBlockUse);

另外,这些文件操作是封装在一个lib里面的。现在非常郁闷啊,请助我一臂之力!
...全文
242 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
geniu_vs 2015-04-23
  • 打赏
  • 举报
回复
我在conn.close()后再delete conn时也有这个问题,错误提示是“*n*.dll损坏”之类的,在网上查了半天后感觉错误原因是:“释放对象过多造成的”这个解释比较合理,虽然我也只创建了一个对象并且只delete一次。所以我采取的措施是 //delete conn; 嘿嘿……不报错了。。。 代码如下: int _tmain(int argc, _TCHAR* argv[]) { TiXmlDocument* doc=new TiXmlDocument("E:\\zzy_test\\DOCDB-201447-Amend-PubDate20141114AndBefore-YU-0001.xml"); doc->LoadFile(); //获取根节点 TiXmlElement* root=doc->RootElement(); MYSQL* conn=new MYSQL(); //调用operateNode函数,遍历根节点 flag++; if (connectionMySQL(conn)) { operateNode(root,conn); //遍历节点并选取有用数据存库(Function函数) mysql_close(conn); //关闭数据库 cout<<"执行完毕!"<<endl; }else { printf("未执行数据库操作!"); } delete doc; //delete conn; getchar(); return 0; }
Tiger-3D 2014-04-18
  • 打赏
  • 举报
回复
应该是debug的程序调用了release的lib导致了这个问题。 我让debug的程序链接debug的lib,release的程序链接release的lib之后,这个问题就没有了
副组长 2014-04-17
  • 打赏
  • 举报
回复
这几行代码没有问题,估计是其它什么地方越界将这里覆盖了什么的。不过好测试,在delete前对CFile对象再进行一些测试操作看看还可以用不,要是不能用了就到别处找原因吧。 删除前才关闭文件?够晚的。
schlafenhamster 2014-04-16
  • 打赏
  • 举报
回复
或者 m_pFile 移动过. new 出来的 , 不要移动.
schlafenhamster 2014-04-16
  • 打赏
  • 举报
回复
m_pFile 被其他 操作破坏
zgl7903 2014-04-16
  • 打赏
  • 举报
回复
可能有越界操作, 详细看看 memset memcpy 数组等操作
dahaiI0 2014-04-16
  • 打赏
  • 举报
回复
就这点代码看不出什么问题,可以试下屏蔽其他代码,或者写个lib demo,只对CFile操作看下还会有问题没
Tiger-3D 2014-04-16
  • 打赏
  • 举报
回复
引用 1 楼 dahaiI0 的回复:
m_pFile也是在lib里new的么
是的,在一个Begin函数里面new的,然后在一个End函数里面来Close和delete的
dahaiI0 2014-04-16
  • 打赏
  • 举报
回复
m_pFile也是在lib里new的么
〉CDIB功能 提供针对设备无关位图的一系列操作。 〉CDIB使用方法 将DIB目录复制到工程的原文件目录中。 在工程的Source Files中添加DIB文件夹,并导入DIB目录中的所有文件。 在需要使用DIB的文件中添加 include "dib.h" using namespace DIB; 1)读取Bitmap图片 //CDib对象可以从读取Bitmap,DIB文件数据。 //之前需要创建CFile对象,而后从CFile对象读取数据。 CDib m_Dib; CFile* pf; pf=new CFile; pf->Open(m_ImageName,CFile::modeRead); //m_ImageName为路径加文件名,如"C:\\Img\\My_Bitmap.bmp" m_Dib.Read(pf); pf->Close(); delete pf; 2)保存CDib对象到文件 //m_Dib是包含有图像数据CDib对象 //pFile 指向已经创建的可对文件进行写操作的CFile对象 m_Dib.write(CFile* pFile) 3)从CDIB获得图像数据 //m_Dib 包含有图像数据CDib对象 //realDataFLag 选择是返回真实图像数据,还是返回灰度数据的布尔值变量(bool),为真返回的是图像真实数据。 unsigned char * img; img=m_Dib.GetImgPtr(realDataFLag); //获得的图像数据是以左上角为(0,0)点开始的从左至右, //从上至下,具有真实宽度(非补4)的数据 //realDataFlag为真返回的是图像真实数据 //realDataFlag为假返回的是灰度化的图像数据 4)将图像数据赋给CDib对象 //m_Dib是包含有图像数据CDib对象 //img 指向图像数据的无符号字符型指针(unsigned char *) //realDataFLag 指明输入的是真实图像数据,还是返回灰度数据的布尔值变量(bool),为真输入的是图像真实数据。 m_Dib.SetImgPtr(img,realDataFlag);//设置图像数据 5)从图像数据创建CDib对象 CDib m_Dib m_Dib.CreateDib(pImgData,width,height,nBitCount);//pImgData为指向图象数据的指针 //nBitCount一个像素所用的比特数 目前仅支持8 6)由CDib对象创建Bitmap对象 //m_Dib是包含有图像数据CDib对象 HBITMAP bitmap; CDC * pDC=AfxGetApp()->GetMainWnd()->GetDC(); bitmap=m_Dib.CreateBitmap(pDC)//输入值为 CDC * ,一般可通过AfxGetApp()->GetMainWnd()->GetDC()获得 7)显示图象中的特殊信息 在处理过程中将图像中的特殊信息用251~255表示(对彩色图像,将R、G、B赋予251~255的相同数值) 将灰度图象中灰度值大于等于251的不需特殊显示的像素赋为250, 将彩色图像中R=G=B且大于等于251的不需特殊显示的像素赋为(250,250,250) 而后按4)中描述的将图像数据赋给CDib对象 最后调用EnhanceColor()将CDib对象转化为可以显示特殊信息的图像

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧