繁体   English   中英

调试断言失败

[英]Debug assertion failed

我一直遇到这个"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;

如果我评论这一部分,程序运行正常。

你的代码破坏了堆。 第一个片段来自C运行时库,断言告诉您程序正在将错误的指针值传递给delete运算符。

注释掉删除语句只是隐藏了问题。 当你继续开发程序时,它将以不同的方式回来困扰你。 这个帖子中有一些调试技巧。 学习如何捕获这些错误是任何C或C ++程序员的成年礼。 欢迎来到该组。

断言是仅在您以调试模式运行时评估的语句(廉价调试检查)。

例如,这将在调试中失败断言,但不会在释放时导致错误:

ASSERT(1 == 2);

您调用的某些方法可能需要某个输入并且没有获得它,但它不会导致立即错误(因此您的代码在非调试模式下工作。)

希望这很有帮助。

如果您可以发布您的特定代码,有人可能会帮助您做出更具体的回复。

程序进入非法状态时会发生断言。 断言是由程序员用代码编写的,以便在出现问题时通知他。 您必须从IDE开始调试,并在收到断言消息时按下break。 你应该看看assert中的条件是什么,比如assert(i > 1024) ,并确保它永远不会变为真。 也许你对assert的含义有一些评论,你必须找到它发生的位置以及原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM