Maison  >  Article  >  développement back-end  >  TIL emalloc() se termine automatiquement en cas d'erreur de mémoire insuffisante

TIL emalloc() se termine automatiquement en cas d'erreur de mémoire insuffisante

Barbara Streisand
Barbara Streisandoriginal
2024-11-05 09:49:02443parcourir

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

J'en avais marre d'écrire ceci encore et encore :

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

Et aujourd'hui, j'ai appris qu'il existe une famille de fonctions e___() comme emalloc() et ecalloc() qui quitteront le processus si le pointeur renvoyé par malloc() est NULL. Ces fonctions ne sont présentes que dans l'en-tête système util.h du système d'exploitation de la famille BSD. Ce ne sont pas des fonctions 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, ...);

Les easprintf(), efopen(), ecalloc(), emalloc(), erealloc(), ereallocarr(), estrdup(), estrndup(), estrlcat(), estrlcpy(), estrtoi(), estrtou( ), et les fonctions evasprintf() fonctionnent exactement comme les fonctions correspondantes qui ne commencent pas par un e sauf qu'en cas d'erreur, elles appellent le gestionnaire d'erreurs installé qui peut être configuré avec esetfunc().

Pour les fonctions de gestion des chaînes, c'est une erreur lorsque le tampon de destination n'est pas assez grand pour contenir la chaîne complète. Pour les fonctions qui allouent de la mémoire ou ouvrent un fichier, c'est une erreur lorsqu'elles renvoient un pointeur nul. Le gestionnaire d'erreurs par défaut est err(). La fonction esetfunc() renvoie la fonction de gestionnaire d'erreurs précédente. Un gestionnaire d'erreurs NULL appellera simplement exit().

— emalloc(3) - Pages de manuel NetBSD

Ces fonctions sont relativement simples. Vous pouvez facilement les mettre en œuvre vous-même.

// 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.

Je pensais juste que c'était cool que ce soit une chose qui soit intégrée à la bibliothèque standard C d'un système d'exploitation. Ce sont des piles incluses, c'est sûr.

Que font les autres langages en cas d'erreurs de mémoire insuffisante ?

  • Java : lancer une exception
  • C : Lance une exception
  • Rouille : Abandonner ou paniquer
  • JavaScript : Crash du moteur
  • Python : lève une exception spéciale
  • Aller : Terminer

Et puis il y a C : renvoie un pointeur nul. ?‍♀️ Idéal si vous avez besoin de ce contrôle, compliqué si vous voulez le chemin du bonheur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn