Saya bosan menulis ini berulang kali:
double* data = (double*)malloc(20 * sizeof(double)); if (data == NULL) { fputs("out of memory", stderr); abort(); }
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, ...);
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.
Saya hanya fikir ia bagus bahawa ini adalah perkara yang dibina dalam pustaka standard C sistem pengendalian. Itu sudah termasuk bateri.
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!