TIL emalloc() auto-keluar pada ralat di luar ingatan

Barbara Streisand
Lepaskan: 2024-11-05 09:49:02
asal
441 orang telah melayarinya

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

Saya bosan menulis ini berulang kali:

double* data = (double*)malloc(20 * sizeof(double));
if (data == NULL) {
  fputs("out of memory", stderr);
  abort();
}
Salin selepas log masuk

Dan hari ini saya mengetahui bahawa terdapat keluarga fungsi e___() seperti emalloc() dan ecalloc() yang akan keluar dari proses jika penuding malloc()-returned ialah NULL. Fungsi ini hanya terdapat dalam keluarga BSD pengepala sistem util.h sistem pengendalian. Ia bukan fungsi C standard.

#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, ...);
Salin selepas log masuk

Easprintf(), efopen(), ecalloc(), emalloc(), erealloc(), ereallocarr(), estrdup(), estrndup(), estrlcat(), estrlcpy(), estrtoi(), estrtou( ), dan fungsi evasprintf() beroperasi sama seperti fungsi sepadan yang tidak bermula dengan e kecuali jika berlaku ralat, mereka memanggil pengendali ralat yang dipasang yang boleh dikonfigurasikan dengan esetfunc().

Untuk fungsi pengendalian rentetan, ia adalah ralat apabila penimbal destinasi tidak cukup besar untuk memegang rentetan lengkap. Untuk fungsi yang memperuntukkan memori atau membuka fail, ia adalah ralat apabila mereka akan mengembalikan penuding nol. Pengendali ralat lalai ialah err(). Fungsi esetfunc() mengembalikan fungsi pengendali ralat sebelumnya. Pengendali ralat NULL hanya akan memanggil exit().

— emalloc(3) - Halaman Manual NetBSD

Fungsi ini agak mudah. Anda boleh melaksanakannya sendiri dengan mudah.

// 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.
Salin selepas log masuk

Saya hanya fikir ia bagus bahawa ini adalah perkara yang dibina dalam pustaka standard C sistem pengendalian. Itu sudah termasuk bateri.

Apakah yang dilakukan oleh bahasa lain terhadap ralat di luar ingatan?

  • Jawa: Lemparkan pengecualian
  • C : Lemparkan pengecualian
  • Karat: Batalkan atau panik
  • JavaScript: Injin rosak
  • Python: Melemparkan pengecualian istimewa
  • Pergi: Tamatkan

Dan kemudian terdapat C: Kembalikan penuding nol. ?‍♀️ Hebat jika anda memerlukan kawalan itu, kerumitan jika anda mahukan jalan yang bahagia.

Atas ialah kandungan terperinci TIL emalloc() auto-keluar pada ralat di luar ingatan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!