gpt4 book ai didi

c++ - 什么是 "debug assertion failed"

转载 作者:行者123 更新时间:2023-11-30 00:45:36 28 4
gpt4 key购买 nike

同样的源代码,编译成debug版本会抛出“debug assertion failed”。但编译成release版本后,可以正常执行。

那么谁能详细解释一下“debug assertion failed”是什么意思?

我很确定源代码中有问题。但是为什么编译成release版本可以正常执行呢?

最佳答案

C++ 没有“调试构建”和“发布构建”的概念。这只是 Microsoft Visual Studio 使用的约定,用于 IDE 中两种不同的默认配置。它甚至不是 Visual C++ 的东西,它只是在 IDE 中。

了解这些 Visual Studio 功能如何与标准 C++ 功能交互很重要 assertNDEBUG,所以让我试着解释一下:


Visual Studio“发布构建”配置的一个方面是 NDEBUG 预处理器宏默认为所有翻译单元定义(这或多或少意味着 “对于所有 .cpp 文件“ 在这种情况下)。相反,在“调试构建”配置中,NDEBUG 默认情况下没有为任何翻译单元定义。

NDEBUG 导致 assert 宏不执行任何操作。 assert 是验证代码某些假设的好方法。正如宏的名称所说,您可以使用它来断言前置条件、后置条件和不变量;您认为您的代码正确执行的事情。

如果断言失败,那么您就发现了一个错误。 您的代码没有按照您的预期行事。这是一个非常严重的问题,通常需要立即终止申请流程以防止出现进一步的问题。

Visual Studio 中“调试构建”配置的另一个方面是它改变了应用程序在断言失败时终止的方式,通过向您显示“调试断言失败”消息框来报告错误。


I am quite sure there is something wrong within the source code. But why it can be executed normally when compiled into release version?

您可能没有在自己的代码中使用 assert,而是使用来自某个包含断言的库(也许是标准库?)的代码。例如,确保使用正确参数调用函数的断言。查看错误消息框的确切内容;它会给你一个提示。

尽管出现错误,您的程序仍继续运行是一件坏事。它可能表现出未定义的行为,而您没有注意到它在做奇怪的事情这一事实应该被认为是运气不好,因为对于未定义的行为,任何事情都可能随时发生。纯属巧合的正常运行只是隐藏了一个错误,该错误会在以后的某个时间点打击您。


Visual Studio 中“调试构建”和“发布构建”配置背后的逻辑是您在开发过程中发现所有错误,测试“调试构建”,而用户运行的“发布构建”没有更多错误检测,因为检测错误可能会减慢程序速度。

就我个人而言,我认为这种逻辑存在严重缺陷。考虑在默认情况下不在任何地方定义 NDEBUG在性能实际受到影响的翻译单元中启用它。即使您知道程序不是您认为的那样继续执行程序也是危险的,因为应用程序逻辑变得不确定。 assert 是专门设计的,您可以针对单个文件打开或关闭它。遗憾的是,此功能使用不多,它实际上关闭了许多程序中有值(value)的错误检测机制。


最后一句话:assert 应该只用于检测错误。您不应使用它来处理与外部资源相关的错误(内存不足、网络错误、文件系统错误)或错误的用户输入。

关于c++ - 什么是 "debug assertion failed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42884436/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com