我厌倦了一遍又一遍地写这个:
double* data = (double*)malloc(20 * sizeof(double)); if (data == NULL) { fputs("out of memory", stderr); abort(); }
今天我了解到有一系列 e___() 函数,例如 emalloc() 和 ecalloc(),如果 malloc() 返回的指针为 NULL,它们将退出进程。这些函数仅存在于 BSD 系列操作系统的 util.h 系统头文件中。它们不是标准 C 函数。
#include <util.h> void (*)(int, const char *, ...) esetfunc(void (*)(int, const char *, ...)); int easprintf(char ** restrict str, const char * restrict fmt, ...); FILE * efopen(const char *p, const char *m); void * ecalloc(size_t n, size_t s); void * emalloc(size_t n); void * erealloc(void *p, size_t n); void ereallocarr(void *p, size_t n, size_t s); char * estrdup(const char *s); char * estrndup(const char *s, size_t len); size_t estrlcat(char *dst, const char *src, size_t len); size_t estrlcpy(char *dst, const char *src, size_t len); intmax_t estrtoi(const char * nptr, int base, intmax_t lo, intmax_t hi); uintmax_t estrtou(const char * nptr, int base, uintmax_t lo, uintmax_t hi); int evasprintf(char ** restrict str, const char * restrict fmt, ...);
easprintf()、efopen()、ecalloc()、emalloc()、eralloc()、erallocarr()、estrdup()、estrndup()、estrlcat()、estrlcpy()、estrtoi()、estrtou( ) 和 evasprintf() 函数的操作方式与不以 e 开头的相应函数完全相同,只是在发生错误时,它们会调用可使用 esetfunc() 配置的已安装错误处理程序。
对于字符串处理函数,当目标缓冲区不够大以容纳完整的字符串时,这是一个错误。对于分配内存或打开文件的函数,当它们返回空指针时是错误的。 默认的错误处理程序是 err()。函数 esetfunc() 返回前一个错误处理函数。 NULL 错误处理程序只会调用 exit()。
— emalloc(3) - NetBSD 手册页
这些功能都比较简单。您可以轻松地自己实现它们。
// I don't know if static or inline is better. inline void * emalloc(size_t n) { void *p = malloc(n); if (p == NULL) { fputs("out of memory", stderr); abort(); } return p; } // Do the same wrapper thing for all the other functions.
我只是觉得这是一个内置到操作系统的 C 标准库中的东西,这很酷。肯定包含电池。
然后是C:返回空指针。 ?♀️ 如果你需要这种控制,那就太好了,如果你想要幸福的道路,那就麻烦了。
以上是TIL emalloc() 在内存不足错误时自动退出的详细内容。更多信息请关注PHP中文网其他相关文章!