首页 > 后端开发 > C++ > 正文

TIL emalloc() 在内存不足错误时自动退出

Barbara Streisand
发布: 2024-11-05 09:49:02
原创
442 人浏览过

TIL emalloc() auto-exits on out-of-memory errors

我厌倦了一遍又一遍地写这个:

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 标准库中的东西,这很酷。肯定包含电池。

其他语言如何处理内存不足错误?

  • Java:抛出异常
  • C : 抛出异常
  • Rust:中止或恐慌
  • JavaScript:使引擎崩溃
  • Python:抛出特殊异常
  • Go:终止

然后是C:返回空指针。 ?‍♀️ 如果你需要这种控制,那就太好了,如果你想要幸福的道路,那就麻烦了。

以上是TIL emalloc() 在内存不足错误时自动退出的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!