CString中的异常---特别紧急,紧急,救我一把

jinxuliang 2006-02-24 08:22:28
程序连续运转三天过后,在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行
请问大家可能造成这个错误的常见操作是那些?举个示例.推荐个标准写法.
...全文
598 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kid4you 2006-02-27
  • 打赏
  • 举报
回复
GetBuffer和ReleaseBuffer之间的问题!
pripor 2006-02-27
  • 打赏
  • 举报
回复
有一款专门检测vc内存泄露的工具
叫什么忘了,但是这样的工具在网上应该找的到
jinxuliang 2006-02-27
  • 打赏
  • 举报
回复
ding
zhangnanonnet 2006-02-27
  • 打赏
  • 举报
回复
建议你在程序运行时在可意的地方打LOG,把一些变量的值都输出到一个文本文件里
jinxuliang 2006-02-26
  • 打赏
  • 举报
回复
郁闷等待下一次出问题,无奈
zhangnanonnet 2006-02-25
  • 打赏
  • 举报
回复
ATLASSERT( pOldData->nAllocLength < nLength );
既然是ASSERT了,就说明pOldData->nAllocLength < nLength 这个表达式是FALSE。你应该检查为什么pOldData->nAllocLength < nLength 不成立了。
会思考的草 2006-02-25
  • 打赏
  • 举报
回复
BoundsChecker跑跑看有没有可疑的地方。
jinxuliang 2006-02-25
  • 打赏
  • 举报
回复
我可以很确定的说
用了GetBuffer就ReleaseBuffer
但是我不知道这样有没有潜在问题,理论上好象没有
while(true)
{
CString m_str;
m_str=" ";
......

}
vcmute 2006-02-25
  • 打赏
  • 举报
回复
用了GetBuffer没有ReleaseBuffer?
jinxuliang 2006-02-25
  • 打赏
  • 举报
回复
这次弄郁闷了
jinxuliang 2006-02-24
  • 打赏
  • 举报
回复
没有办法了
装程序,跟踪statck了。唯一的办法
:-(
大家难道没有遇到过这样的问题吗?
teli_eurydice 2006-02-24
  • 打赏
  • 举报
回复
应该是数组越界
pripor 2006-02-24
  • 打赏
  • 举报
回复
派生cstring吧
自己负责越界问题
rageliu 2006-02-24
  • 打赏
  • 举报
回复
应该是越界问题
jinxuliang 2006-02-24
  • 打赏
  • 举报
回复
时间紧急啊。
jinxuliang 2006-02-24
  • 打赏
  • 举报
回复
必须找到出错的地方啊。郁闷
Jimmy_Xia 2006-02-24
  • 打赏
  • 举报
回复
现在问题在于我无法确定出错代码是在什么地方,因为程序中使用了大量的CString
=========================================================================
你必须要找到问题的所在,这样才能对症下药。
你可以重载CString类,(CMyString),然后里面将每个地方使用CString的操作位置记录到文件里,这样不就可以找到你程序中错误的地方了。
he_sl 2006-02-24
  • 打赏
  • 举报
回复
Debug版本?不能调试吗?
或者想法加输出语句
  • 打赏
  • 举报
回复
可能是指针的问题
一个傻冒 2006-02-24
  • 打赏
  • 举报
回复
最典型的一个就是用来描述内存块属性的属性值和实际的值不一致。出现这个问题的原因就是Cstring为了方便某些应用,提供了一些operations,这些operation可以直接返回内存块中的字符串的地址值,用户可以通过对这个地址值指向的地址进行修改,但是,修改后又没有调用相应的operations1使CstringData中的值来保持一致。比如,用户可以首先通过operations得到字符串地址,然后将一些新的字符增加到这个字符串中,使得字符串的长度增加,但是,由于是直接通过指针修改的,所以描述该字符串长度的CstringData中的nDataLength却还是原来的长度,因此当通过GetLength获取字符串长度时,返回的必然是不正确的。
加载更多回复(7)

16,472

社区成员

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

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

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