Heim > Backend-Entwicklung > C++ > TIL emalloc() wird bei Fehlern wegen unzureichendem Arbeitsspeicher automatisch beendet

TIL emalloc() wird bei Fehlern wegen unzureichendem Arbeitsspeicher automatisch beendet

Barbara Streisand
Freigeben: 2024-11-05 09:49:02
Original
512 Leute haben es durchsucht

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

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();
}
Nach dem Login kopieren

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, ...);
Nach dem Login kopieren

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.
Nach dem Login kopieren

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.

Was tun andere Sprachen bei Fehlern wegen unzureichendem Arbeitsspeicher?

  • Java: Eine Ausnahme auslösen
  • C: Eine Ausnahme auslösen
  • Rost: Abbruch oder Panik
  • JavaScript: Bringt die Engine zum Absturz
  • Python: Löst eine spezielle Ausnahme aus
  • Los: Beenden

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!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage