TIL emalloc() がメモリ不足エラーで自動終了する

Barbara Streisand
リリース: 2024-11-05 09:49:02
オリジナル
443 人が閲覧しました

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();
}
ログイン後にコピー

そして今日、emalloc() や ecalloc() のような e___() 関数のファミリーがあり、malloc() から返されたポインタが NULL の場合にプロセスを終了することを知りました。これらの関数は、オペレーティング システムの util.h システム ヘッダーの BSD ファミリにのみ存在します。これらは標準の 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()、erealloc()、erallocarr()、estrdup()、estrndup()、estrlcat()、estrlcpy()、estrtoi()、estrtou( )、および evasprintf() 関数は、エラーが発生した場合に、esetfunc() で設定できるインストール済みのエラー ハンドラーを呼び出す点を除き、e で始まらない対応する関数とまったく同じように動作します。

文字列処理関数の場合、宛先バッファーが完全な文字列を保持するのに十分な大きさではない場合、エラーになります。メモリを割り当てる関数やファイルを開く関数の場合、null ポインターを返すとエラーになります。 デフォルトのエラー ハンドラは 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: 特別な例外をスローします
  • 移動: 終了

そして、C: null ポインターを返します。 ?‍♀️ その制御が必要な場合は最適ですが、幸せな道を望んでいる場合は面倒です。

以上がTIL emalloc() がメモリ不足エラーで自動終了するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!