程序连续运转三天过后,在debug版本下出现如下提示:
Debug Assertion Failed
Progtam:c:\pepoleorientation\pd.exe
File:e:\Program files\microsoft viusal studio.net 2003\vc7\atlmfc\include\atlsimpstr.h
Line:778
Expression:pOldData->nAllocLength<nLength
For information on how you program can cause an assertion
failue,see the visual c++ documentation on asserts
(Press Retry to debug the application)
终止   重试    忽略
--------------------------------------------
我看了提示文件的源码
ATL_NOINLINE void Reallocate( int nLength )
{
CStringData* pOldData = GetData();
ATLASSERT( pOldData->nAllocLength < nLength );////这里是778行
IAtlStringMgr* pStringMgr = pOldData->pStringMgr;
CStringData* pNewData = pStringMgr->Reallocate( pOldData, nLength, sizeof( XCHAR ) );
if( pNewData == NULL )
{
ThrowMemoryException();
}
Attach( pNewData );
}
---------------------------------------
ATLASSERT( pOldData->nAllocLength < nLength );////这里是778行
请问大家可能造成这个错误的常见操作是那些?举个示例.推荐个标准写法.

解决方案 »

  1.   

    http://blog.csdn.net/laiyiling/archive/2004/10/05/125216.aspx
      

  2.   

    应该是越界
    找一下代码中有没有用类似strcpy这样函数你看出错后有没有内存泄露
      

  3.   

    现在问题在于我无法确定出错代码是在什么地方,因为程序中使用了大量的CString---------------------------------------------------------------------
     nkwesley(江南丝竹) ( ) 信誉:146  2006-02-24 08:55:00  得分: 0  
     
     
       应该是越界
    找一下代码中有没有用类似strcpy这样函数你看出错后有没有内存泄露----
    程序中赋值都是使用的=操作
    也没有使用strcpy
    -----------------------------------------------------------------------------
      
     
      

  4.   

    最典型的一个就是用来描述内存块属性的属性值和实际的值不一致。出现这个问题的原因就是Cstring为了方便某些应用,提供了一些operations,这些operation可以直接返回内存块中的字符串的地址值,用户可以通过对这个地址值指向的地址进行修改,但是,修改后又没有调用相应的operations1使CstringData中的值来保持一致。比如,用户可以首先通过operations得到字符串地址,然后将一些新的字符增加到这个字符串中,使得字符串的长度增加,但是,由于是直接通过指针修改的,所以描述该字符串长度的CstringData中的nDataLength却还是原来的长度,因此当通过GetLength获取字符串长度时,返回的必然是不正确的。
      

  5.   

    Debug版本?不能调试吗?
    或者想法加输出语句
      

  6.   

    现在问题在于我无法确定出错代码是在什么地方,因为程序中使用了大量的CString
    =========================================================================
    你必须要找到问题的所在,这样才能对症下药。
    你可以重载CString类,(CMyString),然后里面将每个地方使用CString的操作位置记录到文件里,这样不就可以找到你程序中错误的地方了。
      

  7.   

    派生cstring吧
    自己负责越界问题
      

  8.   

    没有办法了
    装程序,跟踪statck了。唯一的办法
    :-(
    大家难道没有遇到过这样的问题吗?
      

  9.   

    我可以很确定的说
    用了GetBuffer就ReleaseBuffer
    但是我不知道这样有没有潜在问题,理论上好象没有
    while(true)
    {
    CString m_str;
    m_str=" ";
    ......}
      

  10.   

    BoundsChecker跑跑看有没有可疑的地方。
      

  11.   

    ATLASSERT( pOldData->nAllocLength < nLength );
    既然是ASSERT了,就说明pOldData->nAllocLength < nLength 这个表达式是FALSE。你应该检查为什么pOldData->nAllocLength < nLength 不成立了。
      

  12.   

    建议你在程序运行时在可意的地方打LOG,把一些变量的值都输出到一个文本文件里
      

  13.   

    GetBuffer和ReleaseBuffer之间的问题!