库代码中是否应该检查malloc的返回值?

假如要检查,那么怎么处理NULL分支才好?我个人感觉,作为一个库,肯定不能直接退出进程。而返回错误码又会使接口太过复杂,而且仅仅为了malloc失败这一种情况,就对整个库进行一套错误处理,太不划算了。但是不检查,如果malloc失败,程序会因为访问NULL指针而崩溃,这样算bug吗?很纠结,所以,我想问问最佳实践是什么?
关注者
84
被浏览
11,878

当然需要检查,不检查就是bug,不管你的调用者需不需要处理,你自己都是需要处理的。

你应该至少释放所有已经分配的内部资源并且返回一个错误的值。如果有值得保存的数据,应该尝试保存。

作为一个库来说你绝对没有权利自己去调用abort或者exit,除非调用者违反了你的文档声明传递了非法的参数。你的库的调用者才是决定内存分配失败该怎么处理的人。在内存分配失败的时候,调用者可能需要回滚当前事务或者保存当前文档等等。

如果你想要你的代码可移植,那么你不能抛异常,因为异常的实现是编译器自决的。即使是同一个牌子的编译器,不同版本的编译器的实现也可以不同。如果你不能控制调用者的编译器版本,不要抛异常。