我用Debug调试,在关闭程序时会出现内存不能为written的错误,看调试信息,
在call stack里显示如下:
_free_dbg_lk(void * 0x01455eac, int 4) line 1011 + 48 bytes
_free_dbg(void * 0x01455eac, int 4) line 970 + 13 bytes
CObject::operator delete(void * 0x01455eac) line 46 + 11 bytes
CTraceFrame::`scalar deleting destructor'(unsigned int 1) + 56 bytes
CFrameWnd::PostNcDestroy() line 210 + 31 bytes
CWnd::OnNcDestroy() line 843
CWnd::OnWndMsg(unsigned int 130, unsigned int 0, long 0, long * 0x0012f190) line 1825
CWnd::WindowProc(unsigned int 130, unsigned int 0, long 0) line 1585 + 30 bytes
指针指在第一行的_free_dbg_lk()
不知道这是什么意思???????
CTraceFrame是我自己写的从CFrameWnd继承来的。
是不是在关闭的时候没有释放内存?????
那位大哥帮忙看一下。。
在call stack里显示如下:
_free_dbg_lk(void * 0x01455eac, int 4) line 1011 + 48 bytes
_free_dbg(void * 0x01455eac, int 4) line 970 + 13 bytes
CObject::operator delete(void * 0x01455eac) line 46 + 11 bytes
CTraceFrame::`scalar deleting destructor'(unsigned int 1) + 56 bytes
CFrameWnd::PostNcDestroy() line 210 + 31 bytes
CWnd::OnNcDestroy() line 843
CWnd::OnWndMsg(unsigned int 130, unsigned int 0, long 0, long * 0x0012f190) line 1825
CWnd::WindowProc(unsigned int 130, unsigned int 0, long 0) line 1585 + 30 bytes
指针指在第一行的_free_dbg_lk()
不知道这是什么意思???????
CTraceFrame是我自己写的从CFrameWnd继承来的。
是不是在关闭的时候没有释放内存?????
那位大哥帮忙看一下。。
可能它指向了非法的地方或它指向的地方被非法改写了。总之就是之前有非法的内存越界操作,导致这部分内存被破坏了。
char * pResult; //结果字串
char * pParagraph; //工作字串
int nLen; //该段长度......while(sourceFile.GetPosition()!=sourceFile.GetLength())
{
//读取一段,并将数据放入sParagraph中
sourceFile.ReadString(sSourcestr);
nLen=strlen(sSourcestr);
pParagraph=new char[nLen];
pResult=new char[nLen];
strcpy(pParagraph, (LPCTSTR)sSourcestr); ...... delete [] pResult;
delete [] pParagraph;
}
我觉得没问题。可用Debug调试运行时,却报错:
Debug Error!
Program: E:\...\DataPrepro.exe
DAMAGE: after Normal block (#86) at 0x00421250.
在call stack里也显示:_free_dbg_lk之类的错误。
不知该如何处理?
程序已调通。出错原因在于:
利用strlen(sSourcestr)得到的字符串长度不包含最后的数组终结符;而
strcpy(pParagraph, (LPCTSTR)sSourcestr)拷贝的内容则包括数组终结符。
所以在分配内存时,要多分配一个字节的空间。
在这个函数出出了问题,错误的代码在第1011行处,具体的错误不一定,但一般为内存方面的问题。