2016-11-06 3 views
1

Supposons que je mis un pointeur afin d'avoir une chaîne, par exemple:Est nécessaire de faire un gratuit (chaîne) avant de terminer un programme?

char *string = NULL; 
size_t size = 0; 
getline(&string, &size, stdin); 

est nécessaire de faire un free(string) avant la fin du programme? Comme je pouvais voir chez l'homme, getline appelle malloc() et je l'ai supposé.

+0

Ce n'est pas nécessaire, mais conseillé. Vous pourriez vouloir le refactoriser plus tard et le code qui se nettoie après lui-même est plus facile à placer dans différents contextes. – PSkocik

+1

Je nettoie aussi pour que valgrind me donne un rapport de fuite zéro. Si j'ai zéro fuite, je n'ai pas à m'inquiéter de savoir si une fuite particulière est nuisible (grandit) ou relativement inoffensive. – PSkocik

Répondre

4

Pour vous assurer que votre logiciel n'a pas de fuites de mémoire, vous devez appeler le free pour toute mémoire que vous avez allouée dynamiquement.

La mémoire sera récupérée par le système d'exploitation à la fin du processus, et donc peu importe, à moins que votre mémoire ne soit insuffisante. Toutefois, l'utilisation de free pour libérer de la mémoire est très importante si vous écrivez un logiciel qui s'exécutera en arrière-plan, tel qu'un démon.

Il est recommandé (presque universellement) que le Right Way (tm) soit à free votre mémoire et de ne pas compter sur l'OS pour récupérer cet espace.

+0

"Dans les systèmes d'exploitation modernes ..." Moderne ou pas, c'est la même chose. C ne nécessite pas de programmes pour libérer explicitement la mémoire. Tous les programmes C libèrent leur mémoire lorsqu'ils quittent. –

+0

Oh, je ne le savais pas. N'est-il pas possible pour un programme écrit en C de demander de la mémoire au noyau (un petit noyau intégré, comme celui que j'ai écrit dans ma classe d'organisation) et de terminer sans dire au noyau qu'il n'a plus besoin de l'espace, donc entraînant une fuite de mémoire même après la fin du programme? Je suppose que cela pourrait s'appeler un mauvais noyau mais il ne semble pas que ce soit impossible en principe. –

+1

@JohnKugelman Pas universellement vrai - systèmes d'exploitation tels que VxWorks - un RTOS très utilisé était (probablement toujours?) Des programmes mono-processus, multithread et chargés dynamiquement dans le système (il y avait peu ou pas de protection de la mémoire) . Beaucoup de ses concurrents ont utilisé un modèle similaire. Une fuite de mémoire par un programme n'a pas été nettoyée. Il n'a pas enfreint la norme C, car il n'y avait qu'un seul 'main()'. – marko

-1

Ce n'est pas nécessaire.

Il y a de bonnes raisons pour, comme décrit dans une autre réponse. Mais il y a aussi des raisons de ne pas le faire: le code pour effectuer la libération prend plus de temps pour écrire, déboguer et maintenir, et est une source potentielle supplémentaire de bogues.

Il n'est pas possible de donner une réponse universelle que vous devriez ou ne devriez pas: c'est un choix que chaque projet doit faire, en fonction de ses propres circonstances.