首頁  >  文章  >  後端開發  >  TIL emalloc() 在記憶體不足錯誤時自動退出

TIL emalloc() 在記憶體不足錯誤時自動退出

Barbara Streisand
Barbara Streisand原創
2024-11-05 09:49:02446瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn