La bonne Façon de libérer de la Mémoire d'un retour de la Variable
J'ai créé une fonction qui sert à obtenir la saisie de l'utilisateur. Elle exige que l'allocation de mémoire pour la variable contenant l'entrée de l'utilisateur; toutefois, cette variable est retourné à la fin de la fonction. Quelle est la bonne méthode pour libérer la mémoire allouée/retourne la valeur de la variable?
Voici le code:
char *input = malloc(MAX_SIZE*sizeof(char*));
int i = 0;
char c;
while((c = getchar()) != '\n' && c != EOF) {
input[i++] = c;
}
return input;
Dois-je retourner l'adresse de l'entrée et de le libérer après est-il utilisé?
Curieux de la manière la plus appropriée de la méthode pour libérer de la variable d'entrée.
- Si vous
malloc
, finalement, quelqu'un va avoir besoin defree
, que ce soit dans un autre api ou de l'appelant. Liées, si pris en charge sur votre plate-forme cible(s),getline
, une bibliothèque ajout d'une fonction POSIX.1-2008 date, semble presque faire ce que vous essayez de mettre en œuvre. Il nécessite toujours l'appelant pour finalementfree
tout retourné allocations, mais fournit également la réutilisation de la sémantique, où votre code ne fonctionne pas. En fonction de l'usage prévu et la plate-forme cible(s), il peut être utile d'examiner.
Vous devez vous connecter pour publier un commentaire.
C'est très simple, aussi longtemps que vous passez à
free()
le même pointeur retourné parmalloc()
c'est la fin.Par exemple
Ce que vous ne devriez jamais faire quelque chose comme
parce que
input + n
n'est pas le pointeur de retour parmalloc()
.Mais votre code, a d'autres questions que vous devez prendre soin de
Vous êtes allocation d'espace pour les
MAX_SIZE
char
s de sorte que vous devrait multiplier parsizeof(char)
qui est1
, au lieu desizeof(char *)
qui permettrait d'affecter lesMAX_SIZE
pointeurs, et aussi vous pourriez faireMAX_SIZE
un paramètre de fonction au lieu de cela, parce que si vous êtes l'allocation fixe de la mémoire tampon, vous pouvez définir un tableau dansmain()
avec la tailleMAX_SIZE
commechar input[MAX_SIZE]
, et de le passer àreadInput()
en tant que paramètre, évitant ainsimalloc()
etfree()
.Vous allouez de beaucoup d'espace, mais vous n'avez pas à éviter le débordement dans votre
while
boucle, vous devez vérifier quei < MAX_SIZE
.Vous pouvez écrire une fonction avec un type de retour
char*
, retourinput
, et demander à l'utilisateur d'appelerfree
une fois leur de faire avec les données.Vous pourriez également demander à l'utilisateur de passer dans un tampon de taille eux-mêmes, avec un tampon de limite de taille, et le retour de combien de caractères ont été écrites dans la mémoire tampon.
C'est un classique de la c cas. Une fonction mallocs la mémoire de son résultat, l'appelant doit libérer la valeur de retour. Vous êtes maintenant à marcher sur la glace mince de c fuites de mémoire. 2 raisons
Première ; il n'y a aucun moyen pour vous de communiquer la libre exigence dans un exécutoire (c'est à dire le compilateur ou de l'exécution ne peut pas vous aider contraste avec la spécification de ce que les types d'arguments sont ). Vous avez juste à document quelque part et l'espoir que l'appelant a lire vos documents
Deuxième: même si l'appelant sait gratuit du résultat, il peut faire une erreur, une erreur de chemin d'accès qui a été ce n'est pas pour libérer de la mémoire. Cela ne marche pas à cause d'une erreur immédiate, les choses semblent fonctionner, mais au bout de 3 semaines, votre application se bloque après l'exécution de mémoire
C'est pourquoi tant de "moderne", les langues se concentrer sur ce sujet, c++ les pointeurs intelligents, Java, C#, etc la collecte des ordures,...