程序中使用了大量的CString类.但是在连续运转大约20个小时侯后,在debug模式下提示如下错误:
断言失败
...\atlmfc\include\atlsimpstr.h
line 791
Excpression:nLength<=GetData()->nAllocLength
我查找了对应的文件,抛出异常的是CString类的SetLength方法.///////////////////////////////////////////////////////////
但是我程序中根本没有使用SetLength.只使用了Mid,Left,Right,+,GetBuffer(20),ReleaseBuffer(),=这些操作.
请问这些操作中哪个操作会底层调用SetLength,出现这个问题最有可能是那里处理不当?

解决方案 »

  1.   

    会不会是
    GetBuffer后没有ReleaseBuffer需要一一对应
      

  2.   

    是的.
    GetBuffer以后一定要ReleaseBuffer();说不好听的就象拉了屎自己要打扫一样.....这就是C++的优势----相信程序员.
    而Java不一样,他不相信拉了屎的人会自己打扫,所以就出现了所谓的"垃圾回收"...
      

  3.   

    我检查了所有使用了GetBuffer都配套使用了ReleaseBuffer()
    我想请问这样做会不会有潜在问题:
    int PP::cc()
    {
    CString m_str;
    m_str="";
    ....
    m_str="fdsdfsf";
    return 0;
    }
      

  4.   

    肯能实在析构的时候引用计数出现的问题。用release版的测测看先,如果出错的话,写log跟踪下相应的变量和调用堆栈。
      

  5.   

    CString木有SetLength方法只有GetBufferSetLength
      

  6.   

    Mid,Left,Right这几个函数都是和长度有关系的你可以写个程序,用f11跟进去看mfc的源代码
      

  7.   

    FreeExtra释放所分配的多余的内存
      

  8.   

    to:lixiaosan(小三) 
       CString木有SetLength方法只有GetBufferSetLength
    //////////////////////////////////////////////////...\atlmfc\include\atlsimpstr.h
    line 791
    Excpression:nLength<=GetData()->nAllocLength
    以下是错误提示中给出的文件中对应的代码
    ///////////////////////////////////////////////////
    void SetLength( int nLength )
    {
    ATLASSERT( nLength >= 0 );
    ATLASSERT( nLength <= GetData()->nAllocLength );////这里是791行,此处抛出的异常 if( nLength < 0 || nLength > GetData()->nAllocLength)
    AtlThrow(E_INVALIDARG);

    GetData()->nDataLength = nLength;
    m_pszData[nLength] = 0;
    }
      

  9.   

    看调用堆栈啊,看到底是哪个CString 出了问题。
      

  10.   

    用SEH可以在异常的时候保存堆栈的。