我看了一遍,似乎有很多关于断言的混合观点。例如,如果我指示了一个指针,并想确保它已被正确分配,那我就写道:
p = malloc(sizeof(int));
assert(p)
而不是:
p = malloc(sizeof(int));
if (p == NULL)
{
... send error message
}
我知道断言它会终止程序,但出于测试目的 - 我想知道的是绝对最安全的方式:
malloc
正确完成的事情。malloc
正确处理错误。 答案 0 :(得分:2)
召回assert()
通常仅在 debug 版本的程序中处于活动状态,而不是发布版本。
将潜在错误分类:
1)必须处理的运行时错误
assert()
在这里并不好,而代码必须处理错误。
2)应该处理的运行时错误尚未定义补救措施
assert()
在这里也不明智。代码应发出信号(保留错误信息)并退出。
3)运行时错误,没有简单的重新处理它们
assert()
可以在这里使用。现在当程序出现故障/死亡/挂起时,我们什么都没有。如果可能的话,建议代码应该在#2中发出信号。
4)编译时间错误
assert(sizeof(int)*CHAR_BIT >= 32)
是一个很好的示例用法。假设构建将在调试模式下发生是合理的。即使这会带来部署源代码的风险,该字段中的用户可能会跳过调试版本,因此建议仅使用assert()
作为内部代码。
assert()
是C工具箱中的工具。它有其用途和误用。
使用malloc()
,我参与了许多禁止直接使用C lib malloc()
的项目,而是使用了my_malloc_never_fail()
和my_malloc_may_fail()
这样的项目特定代码处理和指标。正如@Weather Vane评论的那样,良好的错误处理具有挑战性。
答案 1 :(得分:1)
这意味着如果malloc的返回值为非NULL,则可以确保已正确分配内存的 ALL 。
检查NULL返回值是确定malloc是否成功的唯一方法。如果断言失败,assert
函数可用于停止程序,但在程序的生产版本中,
必须有其他错误处理。
errno
变量确定故障发生的原因。 errno
变量也是C标准的一部分。
对于LINUX,这里的值errno
列表可以设置为:
http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Errors/unix_system_errors.html
重要:malloc失败是一个严重的错误。如果发生这种情况 程序执行,不要尝试继续执行其他操作 程序中的功能。 一旦记录错误,就立即停止(退出)程序 报告给该计划的用户,如下:
您应该使用exit
函数并且非零返回
值通知用户程序退出的程序
有错误状态。 exit
函数也是
C语言标准的一部分。
此外,在退出程序之前,请确保所有其他内存 被分配(在malloc失败之前)被正确地解除分配。