函数assert()崩溃在C ++中

时间:2015-11-25 03:28:32

标签: c++ assert

我刚读了一些关于断言的帖子。在里面,我看到段落代码:

int a = 5;
assert(a!=5); // crashing

但我不明白为什么会崩溃:)任何人都可以向我解释。 非常感谢你!

4 个答案:

答案 0 :(得分:2)

它崩溃了,因为这正是想要做的事情。您应该将assert行读作:

  

断言a不等于五。

换句话说,如果 等于5,则断言失败并引发错误。

例如,从C11标准(a)7.2.1.1 The assert macro /2(我的重点):

  

assert宏将诊断测试放入程序中;它扩展为void表达式。执行时,如果表达式(具有标量类型)为假(即比较等于0),则assert宏会写入有关失败的特定调用的信息(包括参数的文本,源文件的名称,源行号和封闭函数的名称 - 后者分别是预处理宏__FILE____LINE__以及标识符__func__的值)在实现定义格式的标准错误流上。

     

然后调用abort函数。

由于以下原因,在大多数情况下,我自己并不是自称断言的忠实粉丝。

首先,断言往往只对调试代码启用,因为它是控制它的NDEBUG预处理器宏,而且调试和发布代码之间的设置通常不同。因此,断言往往仅限于在开发过程中的有用性。

其次,即使在发布代码中断言,断言的效果也不是用户应该看到的。最好是优雅地失败而不是退出程序。

他们 在开发过程中有点用处,但是,在开发过程中任何失败的断言应该是一个即时阻止将代码发布到生产中,直到你为它提供一些更好的错误处理。

那是因为断言要么不会在发布代码中测试(结果可能会是灾难性的),要么你会在发布代码中有断言(你的程序会立即中止。这会导致一些公平的与客户坦诚讨论: - )

(a)是的,我知道这是一个C ++问题,但C ++主要使用cassert这样的遗产标题推迟到C.来自C ++ 14 19.3 Assertions /2

  

内容与标准C库标题<assert.h>相同。

我也知道C ++ 14引用的是C99而不是C11,但断言的内容并没有长时间改变。

答案 1 :(得分:1)

如果你断言的不是真的那么你就会崩溃。如果你说a = 4或断言(a == 5)那你就没事了。请注意,这只是一个调试功能。

答案 2 :(得分:0)

没错。

因为如果assert函数中的参数表达式为false,则会将一条消息写入标准错误设备并调用abort,从而终止程序执行。

enter link description here

答案 3 :(得分:0)

如果这是您的所有代码正在执行的操作,那么它在运行时似乎不会崩溃。我想这也取决于你对'崩溃'的定义。如果你的意思是程序停止运行,那么它会崩溃 - assert()的全部目的是在断言失败时停止运行。如果你的意思是你得到一个段错误或其他东西,那么它不应该崩溃。我创建了一个简单的程序来尝试复制您的问题:

#include <assert.h>

int main() {
    int a = 5;
    assert(a != 5);
    return 0;
}

我编译:     g ++ assert.cpp

...并运行生成的程序,显示:

  

断言失败:(a!= 5),函数main,文件assert.cpp,第5行。

     

中止陷阱:6

因此,它可能是您的程序的另一个问题,或者它可能与您的开发环境有关。