Je comprends que les variables déclarées dans une fonction ont un stockage automatique. Cela signifie-t-il qu'il n'est pas nécessaire d'utiliser les free pointeurs (p ci-dessous) qui ont été explicitement alloués dans un appel de fonction à l'aide de malloc?

void f() {
  int *p;

  p = malloc(sizeof(int));
  *p = 1;
  printf("%p %d\n", p, *p);  // 0x7fc135c02850 1
  free(p);                   // is this necessary?
}

int main() {
  f();
}

(Notez que j'ai utilisé un pointeur vers un int ici, mais la question s'applique à tout pointeur qui est une valeur de retour de malloc et amis.)

Je suppose que non, puisque malloc alloue de la mémoire sur le tas et non sur la pile; ainsi la mémoire vers laquelle pointe p ne sera pas automatiquement désallouée lorsque le frame de pile pour f() est sauté.

4
yangmillstheory 16 nov. 2017 à 03:47

4 réponses

Meilleure réponse

p lui-même est un stockage automatique, et il disparaîtra à la fin de la fonction. Ce qu'il pointe cependant doit être free()'d, à un moment donné. Par exemple, vous pouvez renvoyer la mémoire malloc()'d de la fonction, et free() plus tard - p a toujours disparu

3
Steve 16 nov. 2017 à 00:50

La mémoire que vous allouez avec malloc() doit être free() 'd. Dans votre cas, le stockage automatique s'applique à la variable p elle-même, mais pas à la mémoire que vous avez allouée! Lorsque vous utilisez free(p), vous libérez de la mémoire p pointe vers et non sur la p variable elle-même .

3
Ronan Boiteau 16 nov. 2017 à 00:53

Si vous demandez l'allocation de mémoire manuellement, vous devez libérer manuellement l'espace que vous avez demandé. Si libre est nécessaire là-bas

1
Damián Rafael Lattenero 16 nov. 2017 à 00:50

Correct, un appel à free est nécessaire.

1
zzxyz 16 nov. 2017 à 00:49
47319781