我在调试模式下运行程序时遇到此"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;
}
此代码来自选项卡: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;
如果我在本节中发表评论,该程序运行正常。
答案 0 :(得分:7)
您的代码正在破坏堆。第一个片段来自C运行时库,断言告诉您程序正在将错误的指针值传递给delete运算符。
注释掉删除语句只是隐藏了问题。当你继续开发程序时,它将以不同的方式回来困扰你。 this thread中有一些调试技巧。学习如何捕获这些错误是任何C或C ++程序员的成年礼。欢迎来到该小组。
答案 1 :(得分:2)
断言是仅在您以调试模式运行时评估的语句(廉价调试检查)。
例如,这将在调试中失败断言,但不会在发布中导致错误:
ASSERT(1 == 2);
您调用的某些方法可能需要某个输入并且没有获得它,但它不会导致立即错误(因此您的代码在非调试模式下工作。)
希望这有用。
如果您可以发布特定代码,则有人可以帮助您做出更具体的回复。
答案 2 :(得分:1)
程序进入非法状态时会发生断言。断言是由程序员用代码编写的,以便在出现问题时通知他。您必须从IDE开始调试,并在收到断言消息时按下break。比你应该看到断言中的条件,如assert(i > 1024)
,并确保这永远不会成为现实。也许你对断言的含义有一些评论,你必须找到它发生的位置以及原因。