Belle façon de gérer malloc erreur sans vérifier si la valeur est NULL a été retournée après chaque appel de malloc?
Dans mon code presque chaque fonction a un ou plusieurs appels malloc, et chaque fois que je dois faire quelque chose comme:
char *ptr = (char *)malloc(sizeof(char) * some_int);
if (ptr == NULL) {
fprintf(stderr, "failed to allocate memory.\n");
return -1;
}
que quatre lignes de code supplémentaires et si j'ajoute à chaque fois que après j'utilise un malloc, la longueur de mon code va augmenter beaucoup.. donc, il y a un moyen élégant pour traiter ce problème?
Merci beaucoup!!
- Si la longueur de votre code augmente beaucoup, vous devriez penser à pourquoi vous appelez
malloc
tellement. C'est probablement ce qui indique que vous êtes en essayant de traduire une langue différente idiomes en C plutôt qu'à l'aide de C correctement... - Notez que la conversion de la valeur de retour de
malloc
en C n'est pas nécessaire et peut en cacher une erreur que le compilateur aurait pris sans la fonte. - vous parlez de la
(char *)
droit? Ce genre d'erreurs est-ce à couvrir? - l'erreur se cachant advient-il si vous n'incluez pas
<stdlib.h>
ainsi à l'aide de la fonction sans un prototype. Le compilateur (à tort), ce qui supposemalloc()
renvoie une valeur de typeint
et, sans le cast, se plaint avec une erreur à la tâche parceint*
etint
ne sont pas compatibles. Avec la fonte de forcer le compilateur à se taire ... masquage de l'omission de la droite#include
.
Vous devez vous connecter pour publier un commentaire.
Désolé, mais il n'y a rien que vous pouvez faire à ce sujet que, dans C. Sauf... gasp... envelopper le tout dans une macro qui permettra d'automatiser les
if
de vérifier et de vous permettre d'écrire personnalisé code de gestion d'erreur à chaque fois. Là, je l'ai dit.Sérieusement, C n'est pas destiné à fournir des commodités comme ça. Si vous n'avez pas l'esprit de quitter le programme sur place, vous pouvez l'envelopper dans une fonction bien sûr qui ne
exit
lorsque l'allocation échoue, mais c'est pas de solution générale.Il n'y a généralement pas beaucoup de point en essayant de tomber lorsque toute la mémoire est consommée. Pourrait aussi bien appeler il se ferme:
atexit()
Vous pouvez utiliser des macros. C'est moins cher que le regroupement de ce code dans une fonction, car les Macros n'ont pas les frais généraux d'un appel de fonction de l'épreuve. Les Macros sont développées par le préprocesseur étape de la compilation, et peut être vérifié par le "- E " option de gcc.
Maintenant dire que nous avons func1(), func2(), func3()
Lorsque vous n'avez pas de véritable erreur de manipulation (à l'exception de quelque chose d'impression et de sortie), le simple et établi solution consiste à définir une fonction safe_malloc qui intègre le vérifier. (Edit: Ou, bien sûr, une macro. Quelles que soient les rochers de votre bateau.)
Si vous condition d'erreur est toujours aussi simple (impression de message d'erreur et retour), vous pouvez réécrire pour enregistrer les lignes.
C runtime doit nettoyer toutes les ressources, y compris les fichiers ouverts, les tampons et les données allouées. De même, j'aime utiliser
int atexit( void(*)(void))
d'appel enregistré fonctions sur une sortie normale. Aussi quitter immédiatement siatexit
renvoie une valeur non nulle, ce qui signifie que votre fonction n'a pas été enregistrée.Puis la sortie malloc échec.
atexit
fonction. La macro à partir de Anoop Menon permettrait que. En cas d'erreur de manipulation est différente par fonction, il serait plus clair de ne pas utiliser une macro d'abstraction.Ou vous pouvez utiliser un extern.
Définir une fonction dans le main.c:
N'importe quel fichier que mallocs ajouter de la mémoire comme vous le feriez pour une déclaration anticipée:
Maintenant écrire malloc comme:
Le lien entre l'endroit dans le code où vous malloc avais de la mémoire et de la main.c qui gère l'exception est générée en coulisses par l'éditeur de liens; il cartes d'appels à la fonction avec la fonction, même si les deux existent dans différents fichiers source.