比方说,我正在C编写一个小图书馆 – 一些数据结构。如果我无法分配内存,该怎么办?
这可能是非常重要的,例如我需要一些内存来初始化数据结构,或者我插入一个键值对,并希望将它包装在一个小的结构体中。它也可能不那么关键,例如像一个pretty_print函数,建立一个很好的字符串表示的内容。但是,通常比您的平均错误更严重 – 可能还没有一点继续。如果返回NULL,那么大量的使用malloc在线的例子只是直接退出程序。我猜测很多真正的客户端代码也是这样 – 只是弹出一些错误,或者写到stderr,并中止。 (并且很多真正的代码可能根本不检查malloc的返回值。)
有时返回NULL是有意义的,但并不总是。错误代码(或只是一些布尔成功值),无论是作为返回值还是外部参数都可以正常工作,但似乎他们可能会混乱或者伤害了API的可读性(然后再次,也许这在C语言中有些预期? )。另一个选择是具有某种内部错误状态,呼叫者可以随后查询,例如。使用get_error函数,但是您必须注意线程安全性,可能很容易错过;人们往往对于检查错误来说很松懈,如果它是一个单独的功能,他们可能不知道它们,或者他们可能不会打扰(但是我猜这是他们的问题)。
(我有时会看到malloc包装在一个函数中,只是再次尝试,直到内存可用…
void *my_malloc(size_t size)
{
void *result = NULL;
while (result == NULL)
result = malloc(size);
return result;
}
但这似乎是愚蠢的,也许是危险的。)
什么是正确的方法来处理?