调试断言失败
我一直遇到这个"Debug assertions failed!"
当我在调试模式下运行我的程序时出错。 我试图在Visual C ++网站上查找这个错误,但是对于我来说解释过于先进,并且它们与我对该问题的最佳猜测没有任何相似之处。
我已经通过我的代码并缩小了发生错误的地方。 它似乎发生在代码的一部分,我在计算机移动到程序的下一部分之前手动删除了一堆堆阵列。 当我注释掉释放旧堆阵列的部分时,程序运行得非常好。
任何想法这里发生了什么? 我在编程方面的知识还是比较基础的。
谢谢
我正在使用Visual C ++ 2008。
更多信息:
在这段代码中触发断点:
void operator delete(
void *pUserData
)
{
_CrtMemBlockHeader * pHead;
RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
if (pUserData == NULL)
return;
_mlock(_HEAP_LOCK); /* block other threads */
__TRY
/* get a pointer to memory block header */
pHead = pHdr(pUserData);
/* verify block type */
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));//<---- break point triggers
_free_dbg( pUserData, pHead->nBlockUse );
__FINALLY
_munlock(_HEAP_LOCK); /* release other threads */
__END_TRY_FINALLY
return;
}
这段代码来自tab:dbgdel.cpp
我的“缩小”导致此问题的代码部分是这样的:
delete [] topQuadanglesPositions;
delete [] fourClamps;
delete [] precaculatedClamp1;
delete [] precaculatedClamp2;
delete [] precaculatedClamp3;
delete [] precaculatedClamp4;
delete [] area;
delete [] hullConfiguration;
delete [] output;
delete [] prunedListClamp1;
delete [] prunedListClamp2;
delete [] prunedListClamp3;
delete [] prunedListClamp4;
delete [] numValidLocations;
如果我评论这部分,程序运行良好。
你的代码正在破坏堆。 第一个代码片段来自C运行时库,assert告诉你程序正在向delete运算符传递一个错误的指针值。
注释掉删除语句只是隐藏了问题。 当你继续开发程序时,它会回来困扰你。 在这个线程中有一些调试技巧。 学习如何捕捉这些类型的错误对任何C或C ++程序员来说都是成功的典范。 欢迎来到这个小组。
断言是只在您以调试模式运行时评估的语句(廉价调试检查)。
例如,这将在调试中失败,但不会在发布中导致错误:
ASSERT(1 == 2);
很可能您调用的某个方法需要某个输入并且没有得到它,但它不会导致直接错误(因此,您的代码在非调试模式下工作。)
希望这有帮助。
如果您可以发布您的特定代码,则某人可能可以帮助您做出更具体的回应。
断言在程序进入非法状态时发生。 断言是由程序员用代码编写的,以便在出现问题时通知他。 您必须从IDE开始调试,并在得到断言消息时按下中断。 比你应该看到什么是断言的条件,像assert(i > 1024)
,并确保这永远不会成真。 也许你对assert的含义有一些评论,你必须找到它发生的地方以及为什么。
下一篇: Immediate detection of heap corruption errors on Windows. How?