2010-01-10 5 views
2

Lorsque j'alloue de la mémoire en dehors d'une boucle while par exemple, est-ce que je peux la libérer à l'intérieur? Ces deux codes sont-ils équivalents?Quand libérer de la mémoire dans un code C?

int* memory = NULL; 
memory = malloc(sizeof(int)); 
if (memory != NULL) 
{ 
    memory=10; 
    free(memory); 
} 


int* memory = NULL; 
memory = malloc(sizeof(int)); 
if (memory != NULL) 
{ 
    memory=10; 
} 
free(memory); 
+3

Ne vous dire « si la déclaration » plutôt que « en boucle » – ChrisF

+0

Be Assurez-vous d'écrire les fonctions wrapper pour 'malloc' et' free'. Ainsi, si vous souhaitez modifier l'implémentation sous-jacente (par exemple, utiliser une fonction d'allocation de mémoire plus rapide), seules deux lignes doivent être modifiées (les lignes pour 'malloc' et' free'). Et cela vous permettra d'éviter la duplication de code. –

Répondre

4

Oui, ils sont équivalents. Vous n'avez pas besoin d'appeler free() si l'allocation n'a pas abouti.
Faites attention, que memory est pointeur vers int et vous devez déréférencer pour assigner quelque chose à son bloc de mémoire;

int* memory = NULL; 
memory = malloc(sizeof(int)); 
if (memory) 
    *memory=10; 
free(memory); 
memory = NULL; 
+0

Non, ils ne sont pas équivalents. Quand 'malloc' échoue, une version appellera' free' alors que l'autre ne le fera pas. –

3

Peu importe si vous êtes sûr de ne le libérer qu'une seule fois.

Une bonne idée est de toujours définir un pointeur = NULL lorsque vous libérez, puis si elle est à nouveau free'ed il ne sera pas question

+0

Oh, maintenant je voudrais avoir payé une meilleure attention à la page 3 homme libre. Mon code est jonché de chèques pour NULL avant de libérer des objets! –

+0

Tout le monde le fait - mais presque personne ne vérifie si malloc renvoie NULL –

1

Oui. La chose importante est trop libre une fois. (Une fois que vous avez terminé d'utiliser la mémoire)

1

Tout d'abord, vous ne pouvez le libérer qu'une seule fois. Donc, si vous voulez le libérer dans une boucle (comme votre question le suggère), la deuxième solution est la seule bonne façon de procéder.

Si vous souhaitez le libérer dans une instruction if, les deux solutions sont techniquement correctes. Cependant, c'est une bonne pratique de toujours libérer la mémoire que vous utilisez et il est alors plus facile de toujours libérer la mémoire à la fin en dehors de toute instruction if. Donc, mon conseil est: quoi que vous essayiez de faire: toujours libérer la mémoire en dehors de toute déclaration de boucle/if (en supposant que vous n'en avez plus besoin bien sûr). Je le libère généralement à la fin de la fonction où il est utilisé pour la dernière fois mais cela dépend vraiment de la fonction elle-même, de sa longueur, ...

Essayez de trouver votre façon de faire les choses et respectez-la: elle vous sauvera beaucoup de temps de cerveau inutile (qui est vraiment précieux)

4
int* memory = NULL; 
memory = malloc(sizeof(int)); 
if (memory != NULL) 
{ 
    memory=10; 
    free(memory); 
} 

Cela va planter. Vous définissez le pointeur sur l'emplacement de mémoire 10, puis demandez au système de libérer la mémoire. Il est extrêmement improbable que vous ayez précédemment alloué de la mémoire qui est arrivé à 0x10, même dans le monde fou des espaces d'adresses virales. En outre, SI malloc a échoué, aucune mémoire n'a été allouée, vous n'avez donc pas besoin de le libérer.

int* memory = NULL; 
memory = malloc(sizeof(int)); 
if (memory != NULL) 
{ 
    memory=10; 
} 
free(memory); 

Ceci est également un bug. Si malloc échoue, vous placez le pointeur sur 10 et libérez cette mémoire. (comme avant.) Si malloc réussit, alors vous libérez immédiatement la mémoire, ce qui signifie qu'il était inutile de l'allouer! Maintenant, j'imagine que c'est juste un exemple de code simplifié pour faire passer le message, et que ce n'est pas présent dans votre vrai programme? :)

+0

+1 bonnes observations! –

1

Une règle générale que j'aime à suivre est de libérer de la mémoire dans la même portée qu'il a été attribué à.

Questions connexes