您的位置:首页 > 其它

VC6 DEBUG版的一个BUG

2006-10-26 13:32 344 查看
同事写了一个服务程序,需要长期运行,却不定期的出现异常,调试发现出错位置位于DBGHEAP.c文件第338行,这部分的代码为:

/* break into debugger at specific memory allocation */
if (lRequest == _crtBreakAlloc)
_CrtDbgBreak();
这段代码的作用是在用户指定的内存分配点进行中断,以便于用户调试。其中,lRequest(等于_lRequestCurr)记录了当前内存分配次数,_crtBreakAlloc为用户设置的中断点(通过调用_CrtSetBreakAlloc进行设置),其初始值为-1L,即long型整数最大值,问题便发生在这里,因为即使用户没有设置中断点,那么随着程序的运行其内存分配次数也有会有达到最大值的那一刻,_CrtDbgBreak在非调试状态下便会弹出错误对话框。

当然,我们也可以说这不是错误,因为一般的程序不会有那么多的内存分配次数,而且这只在DEBUG版下才会发生,后来同事改用RELEASE版便没有此问题了。

从中我们可以得出两个结论:
1. MS的这段代码不够严密,没有考虑到极限情况,实际我们有时也会犯这样的错误。
2. 证明我们的程序存在非常频繁的动态内存分配,可以考虑使用内存池以提高效率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: