C++ Assert()-它有什么好处?
我不明白C++ Assert()-它有什么好处?,c++,assert,C++,Assert,我不明白assert()的目的 我的讲师说assert的目的是发现bug 例如: double divide(int a , int b ) { assert (0 != b); return a/b; } 上述断言是否合理?我认为答案是肯定的,因为如果我的程序 不应该与0(数字零)一起工作,但不知何故,零确实会进入b变量,那么代码就有问题了 我说得对吗 你能给我看一些关于合理的断言()的例子吗 关于断言的目的是在调试期间发出意外行为的信号(因为它仅在调试版本中可用)。你的例子是一个
assert()
的目的
我的讲师说assert的目的是发现bug
例如:
double divide(int a , int b )
{
assert (0 != b);
return a/b;
}
上述断言是否合理?我认为答案是肯定的,因为如果我的程序
不应该与0
(数字零)一起工作,但不知何故,零确实会进入b
变量,那么代码就有问题了
我说得对吗
你能给我看一些关于合理的断言()的例子吗
关于断言的目的是在调试期间发出意外行为的信号(因为它仅在调试版本中可用)。你的例子是一个合理的断言案例。下一行可能会崩溃,但是使用assert,您可以选择在命中该行之前中断执行,并进行一些调试 这通常与异常并行进行-您断言表示有问题,并抛出异常以优雅地处理该情况(甚至退出程序):
在某些情况下,您希望继续执行,但仍然希望发出出错的信号。您对
断言
的评估非常准确,除了在调试阶段通常使用断言
。。。这是因为您不希望在生产代码期间触发assert
。。。抛出异常(并正确处理它们)是生产级代码中运行时错误管理的正确方法
不过,一般来说,assert
用于测试假设。如果在调试阶段代码中未满足假定条件,特别是当您获取的值超出所需输入的界限时,您希望程序在遇到错误时退出,以便可以修复它。例如,假设您正在调用一个返回指针的函数,并且该函数不应返回NULL
指针值。换句话说,返回一个NULL
值不仅仅是一个错误条件的指标,它还意味着对代码工作方式的假设是错误的。这是一个使用断言的好地方。。。您假设您的程序将以一种方式工作,如果它不工作,那么您不希望错误传播到其他地方导致一些难以找到的错误。。。当它发生时,您希望立即将其禁用
最后,您可以将内置宏与
assert
相结合,例如\uuuuuu LINE\uuuuu
和\uuuu FILE\uuuuuuu
,它们将为您提供进行assert的代码中的文件和行号,以帮助您快速确定问题区域。assert用于在调试环境中测试有关代码的假设。断言通常对最终生成没有影响
它是否有效完全是另一回事。如果不了解您的应用程序,我们无法回答此问题
断言永远不会失败。如果您看到断言可能失败,那么您需要使用If语句来处理条件不为true的情况。断言仅适用于您认为永远不会失败的条件。
assert
用于验证在
程序是正确的。在您的示例中,assert
是否合理
取决于divide
:ifb!=0是一个先决条件,
然后,断言
通常是验证它的首选方法:如果
有人在不满足前提条件的情况下调用函数,这是一个
编程错误,应使用极限终止程序
偏见,尽可能少做额外的工作。(通常。
有些应用程序的情况并非如此,但事实确实如此
最好是抛出一个例外,蹒跚前行,期待最好的结果。)
但是,如果divide的规范定义了b时的somw行为
==0
(例如,返回+/-Inf),则应实现此功能,而不是
使用断言
此外,如果结果显示assert
无效,也可以将其关闭
需要太多的运行时间。但是,通常情况下,这只能在
代码的关键部分,并且仅当探查器显示您
我真的需要它
FWIW:与您的问题无关,但您发布的代码将
对于除以(1,3)
,返回0.0
。不知怎的,我不认为这是
您想要的。断言用于在代码执行期间检查不变量,这些是程序员假定始终保持不变的条件,如果它们与假设不同,则代码中存在错误
断言也可用于检查先决条件和后决条件,第一个断言在某些代码块之前进行检查,并验证提供的数据/状态是否正确,第二个断言检查某些计算的结果是否正确。这有助于缩小问题/bug的位置:
assert( /*preconditions*/ );
/*here some algorithm - and maybe more asserts checking invariants*/
assert( /*postconditions*/ );
有正当理由的资产的一些例子:
检查函数返回值,例如,如果您调用某个外部API函数,并且您知道它仅在出现编程错误时返回某个错误值:
WinAPI Thread32First函数要求提供的LPTHREADENTRY32结构具有正确分配的dwSize字段,如果出现错误,则会失败。此失败应该由assert捕获
若函数接受指向某些数据的指针,那个么在函数的开头添加assert以验证它是否为非null。如果此函数不能在空指针上工作,则这是有意义的
如果您在设置了超时的互斥锁上有一个锁,那么如果这个超时结束,那么您可以使用断言来指示可能的竞争条件/死锁
。。。还有更多
断言的好技巧是在里面添加一些信息,例如:
断言(假&“原因”
assert( /*preconditions*/ );
/*here some algorithm - and maybe more asserts checking invariants*/
assert( /*postconditions*/ );
// ptr is never NULL
// vec has now n elements
assert(ptr!=0);
assert(vec.size()==n);