Utilisation appropriée de realloc()
De l'homme realloc:Le realloc() renvoie un pointeur vers la mémoire nouvellement allouée, qui est correctement alignés pour tout type de variable et peut être différente de ptr, ou NULL si la demande échoue.
Donc dans cet extrait de code:
ptr = (int *) malloc(sizeof(int));
ptr1 = (int *) realloc(ptr, count * sizeof(int));
if(ptr1 == NULL){ //reallocated pointer ptr1
printf("Exiting!!\n");
free(ptr);
exit(0);
}else{
free(ptr); //to deallocate the previous memory block pointed by ptr so as not to leave orphaned blocks of memory when ptr=ptr1 executes and ptr moves on to another block
ptr = ptr1; //deallocation using free has been done assuming that ptr and ptr1 do not point to the same address
}
Est-il suffisant de simplement supposer que le réaffectées pointeur pointe vers un autre bloc de mémoire et de ne pas le même bloc.Parce que si l'hypothèse devient faux et realloc renvoie l'adresse de l'origine du bloc de mémoire pointé par ptr et puis free(ptr) exécute(pour la raison donnée dans les commentaires), alors que le bloc de mémoire seraient effacés et le programme aller de noix.
Dois-je le mettre dans une autre condition qui permettra de comparer l'égalité de ptr et ptr1 et de l'exclure de l'exécution de la free(ptr) déclaration?
OriginalL'auteur user3163420 | 2014-01-08
Vous devez vous connecter pour publier un commentaire.
Il suffit de ne pas appeler
free()
sur votre ptr dans la bonne voie. Essentiellementrealloc()
a fait pour vous.Vraiment? Sur mon Mac
man realloc
: "... Si il n'y a pas assez de place pour agrandir l'allocation de mémoire pointé par ptr, realloc() crée une nouvelle allocation, que les copies de beaucoup de anciennes données pointé par ptr correspondra à la nouvelle répartition, libère l'ancienne allocation, et retourne un pointeur vers la mémoire allouée. ..."Ne jette pas le résultat de
malloc
etrealloc
.Je ressens le besoin de deuxième zenith suggestion. Si ce n'était pas pour le jette, vous auriez probablement les deux plus +1s.
heh... la typecasts ne sont pas juste une horreur, mais peut causer des problèmes sur certains obscur systèmes et ne servent à rien... mais vous avez tenu à conserver le code d'origine. Maintenant, les espaces ont été introduites afin de la rendre moins d'une pollution visuelle, qui permettent également sans but fonctionnel mais ne va pas casser quoi que ce soit (contrairement à typecasts, qui sera). Mon point est, si vous voulez permettre à des espaces ajoutés pour rendre le code style attrayant, voulez-vous permettent également inutile typecasts être enlevé pour rendre le code portables à style attrayant? Je ne vais pas le modifier, mais pourriez-vous revenir si je l'ai fait?
OriginalL'auteur Aaron S. Kurland
OP: ... peut-être différente de ptr, ou NULL si la demande échoue.
Un: non, Pas toujours.
NULL
peut légitimement être retourné (pas un échec), sicount
est de 0.OP: Est-il suffisant de simplement supposer que le réaffectées pointeur pointe vers un autre bloc de mémoire et de ne pas le même bloc.
R: Non
OP: dois-je le mettre dans une autre condition qui permettra de comparer l'égalité de ptr et ptr1 et de l'exclure de l'exécution de la free(ptr) déclaration?
R: Non.
Si
realloc()
retourneNULL
(et de comptage n'est pas 0), la valeur deptr
est toujours valide, pointant à l'onu-redimensionnée de données.free(ptr)
ou pas dépend de vos objectifs.Si
realloc()
retourne pasNULL
, ne pasfree(ptr)
, il est tout prêt libéré.Exemple: https://codereview.stackexchange.com/questions/36662/critique-of-realloc-wrapper
OriginalL'auteur chux
L'application de correctifs modifications, basé sur le bon commentaires ci-dessous.
Lecture ce comp.lang.c question, révèle 3 cas:
realloc
ne peut pas trouver suffisamment d'espace à tous, elle renvoie un pointeur null, et laisse le précédent région affectée."Ce qui peut être traduit directement de code:
Donc, si vous pensez à ce sujet, le code que vous avez posté est très bien (ou presque). Le code ci-dessus se simplifie en:
Note supplémentaires
else if(ptr != tmp)
, ce qui exclut les Cas 1, au cas où vous ne souhaitez pas appelerfree(ptr)
parce queptr
ettmp
reportez-vous à la même emplacement. Aussi, juste par sécurité, j'ai assurez-vous d'attribuerNULL
àtmp
pour éviter toute bancale problèmes de pointeur tout entmp
est dans la portée.ptr != tmp
cas, lafree(ptr)
est faux.D'accord avec @glglgl que cette réponse est dangereux, car vous ne devez pas appeler free(ptr) dans le cas 2.
Bon appel, appliqué comme une modification, et le commentaire de upvotes pour vous deux.
OriginalL'auteur Keeler
realloc
sera de retour la même adresse pourptr
si elle a assez d'espace pour étendre la partie de la mémoire pointée parptr
. Autrement, il va déplacer les données vers le nouveau morceau et gratuit de l'ancien bloc. Vous ne pouvez pas compter surptr1
être différent deptr
. Votre programme se comporte pas défini.Si
realloc
renvoie une autre adresse, il libère l'ancien, de sorte que vous n'avez pas à le faire vous-même.Par le chemin, ne jamais lancer le retour de
malloc/realloc
:). Votre code devrait ressembler à ceci:Eh bien, qui fait du sens. Par ailleurs, le programme est sur le point de sortir donc pas de problème de ne pas le libérer 🙂 Fixation 🙂
C'est un détail d'implémentation et pas vrai en général: "realloc sera de retour la même adresse pour ptr si elle a assez d'espace pour étendre la partie de la mémoire pointé par ptr." Les implémentations que de séparer les crédits alloués par la taille (par exemple, OpenBSD omalloc) ont peu de chances de jamais retourner l'original de pointeur, sauf lorsque l'original et de nouvelles tailles de match.
Pour l'ajout de la note sur le casting de retour de malloc (), etc. +1
ptr=realloc(ptr,count*sizeof(int));
est brisée; quandrealloc
retourneNULL
(ce qui n'est pas une adresse car il n'a pas de point sur un objet), vous avez une fuite de la mémoire de l'ancien objet. Le OpenGroup manuel états: "Si l'espace ne peuvent pas être attribuées, l'objet doit rester inchangée." Le C standard états: "Si la mémoire pour le nouvel objet ne peut pas être alloué, l'ancien objet n'est pas libéré, et sa valeur est inchangée."OriginalL'auteur Paulo Bu
Si
realloc
se déplace à vos données, il permettra de libérer l'ancien pointeur pour vous dans les coulisses. Je n'ai pas de copie de la norme C11, mais il est garanti dans le standard C99.realloc
section de n1570.html, qui a été converti à partir n1570.pdf).OriginalL'auteur tabstop
Vous devriez pas
free
original de votre pointeur si lerealloc
réussit. Si vousfree
le pointeur si lerealloc
échoue dépend des besoins de votre application particulière, si vous absolument ne peut pas continuer sans que de la mémoire supplémentaire, alors ce serait une erreur fatale et vous libérer de tout lieu de stockage et de sortie. Si, otoh, que, vous pouvez toujours continuer à (peut-être exécuter une autre opération et espère que la mémoire seront disponibles plus tard), vous voudrez probablement s'en tenir à ce mémoire et d'une tentative d'un autrerealloc
plus tard.Le chapitre et le verset:
Italiques ajoutés. Note l'article 4; le pointeur retourné peut être le même que l'original de votre pointeur.
OriginalL'auteur John Bode