Ich hatte es satt, das immer und immer wieder zu schreiben:
double* data = (double*)malloc(20 * sizeof(double)); if (data == NULL) { fputs("out of memory", stderr); abort(); }
Und heute habe ich erfahren, dass es eine Familie von e___()-Funktionen wie emalloc() und ecalloc() gibt, die den Prozess beenden, wenn der von malloc() zurückgegebene Zeiger NULL ist. Diese Funktionen sind nur im util.h-Systemheader der BSD-Betriebssystemfamilie vorhanden. Es handelt sich nicht um Standard-C-Funktionen.
#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, ...);
Die easprintf(), efopen(), ecalloc(), emalloc(), erealloc(), ereallocarr(), estrdup(), estrndup(), estrlcat(), estrlcpy(), estrtoi(), estrtou( ) und evasprintf()-Funktionen funktionieren genauso wie die entsprechenden Funktionen, die nicht mit einem e beginnen, außer dass sie im Fehlerfall den installierten Fehlerhandler aufrufen, der mit esetfunc() konfiguriert werden kann.
Bei den String-Verarbeitungsfunktionen liegt ein Fehler vor, wenn der Zielpuffer nicht groß genug ist, um den gesamten String aufzunehmen. Bei Funktionen, die Speicher allokieren oder eine Datei öffnen, ist es ein Fehler, wenn sie einen Nullzeiger zurückgeben würden. Der Standard-Fehlerbehandler ist err(). Die Funktion esetfunc() gibt die vorherige Fehlerbehandlungsfunktion zurück. Ein NULL-Fehlerbehandler ruft einfach exit() auf.
— emalloc(3) – NetBSD-Handbuchseiten
Diese Funktionen sind relativ einfach. Sie können sie ganz einfach selbst umsetzen.
// 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.
Ich fand es einfach cool, dass dies etwas ist, das in die C-Standardbibliothek eines Betriebssystems integriert ist. Die Batterien sind auf jeden Fall im Lieferumfang enthalten.
Und dann ist da noch C: Gibt einen Nullzeiger zurück. ?♀️ Großartig, wenn Sie diese Kontrolle brauchen, ein Aufwand, wenn Sie den glücklichen Weg wollen.
Das obige ist der detaillierte Inhalt vonTIL emalloc() wird bei Fehlern wegen unzureichendem Arbeitsspeicher automatisch beendet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!