Maison > développement back-end > C++ > le corps du texte

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

Barbara Streisand
Libérer: 2024-11-05 09:49:02
original
441 Les gens l'ont consulté

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();
}
Copier après la connexion

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, ...);
Copier après la connexion

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.
Copier après la connexion

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!

source:dev.to
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!