我用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继承来的。
是不是在关闭的时候没有释放内存?????
那位大哥帮忙看一下。。

解决方案 »

  1.   

    你那个CObject的指针有问题了。
    可能它指向了非法的地方或它指向的地方被非法改写了。总之就是之前有非法的内存越界操作,导致这部分内存被破坏了。
      

  2.   

    我的一段程序如下:
    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之类的错误。
    不知该如何处理?
      

  3.   

    谢谢!
    程序已调通。出错原因在于:
    利用strlen(sSourcestr)得到的字符串长度不包含最后的数组终结符;而
    strcpy(pParagraph, (LPCTSTR)sSourcestr)拷贝的内容则包括数组终结符。
    所以在分配内存时,要多分配一个字节的空间。
      

  4.   

    _free_dbg_lk(void * 0x01455eac, int 4) line 1011 + 48 bytes
    在这个函数出出了问题,错误的代码在第1011行处,具体的错误不一定,但一般为内存方面的问题。