Last active
August 29, 2015 13:56
-
-
Save mr21/8835947 to your computer and use it in GitHub Desktop.
Les choses un peu cachees de malloc / realloc
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Que renvoyer lors d'un : malloc(0); ? | |
La regle dit que tout retour de malloc doit pouvoir aller dans free et realloc. | |
Du coup pour simplifier il est possible de renvoyer NULL. | |
*/ | |
free(NULL); /* est valide et ne fait rien. */ | |
/* | |
Le realloc d'un pointeur NULL est equivalent a un malloc, | |
ainsi ces deux lignes sont identiques: | |
*/ | |
int* ptr = malloc(n * sizeof *ptr); | |
int* ptr = realloc(NULL, n * sizeof *ptr); | |
/* | |
Un realloc de 0 est equivalent a un free | |
(finalement il est possible de gerer toute sa memoire dynamique | |
sans jamais appeller "malloc" et "free" dans son code). | |
Ainsi ces deux lignes sont similaires: | |
*/ | |
free(ptr); | |
realloc(ptr, 0); | |
/* | |
Sauf que realloc renverra NULL a ce moment la, | |
du coup on peut s'en servir pour resetter le ptr a NULL juste apres: | |
*/ | |
ptr = realloc(ptr, 0); | |
/* au lieu de devoir faire: */ | |
free(ptr), ptr = NULL; | |
/* | |
Surcharger malloc/free/realloc sans surcharger calloc est voue au segfault... | |
Impossible (ou presque) de savoir comment est fait le vrai calloc. | |
Du coup il est trop dangereux d'essayer de free sois meme un pointeur venant du vrai calloc. | |
*/ | |
int* ptr = calloc(n, sizeof *ptr); | |
/* la ligne ci-dessus est un raccourci pour: */ | |
int* ptr = malloc(n * sizeof *ptr); | |
if (ptr) memset(ptr, 0, n * sizeof *ptr); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment