void x()
{
strcpy(a, strdup(p));
}
(erreur) Attribution avec strdup, strcpy ne libère passtrdup() et strcpy
Quelqu'un peut-il me dire ce qui ne va pas avec l'énoncé ci-dessus et pourquoi je reçois cette erreur?
void x()
{
strcpy(a, strdup(p));
}
(erreur) Attribution avec strdup, strcpy ne libère passtrdup() et strcpy
Quelqu'un peut-il me dire ce qui ne va pas avec l'énoncé ci-dessus et pourquoi je reçois cette erreur?
Le problème est que vous fuyez la mémoire. L'appel à strdup
alloue de la mémoire qui n'est pas libérée. Le pointeur vers la mémoire qui est passée à strcpy
n'est jamais enregistré nulle part et le compilateur peut donc prouver qu'il est divulgué.
Je ne suis pas sûr de ce que vous essayez de faire depuis strdup
effectue à la fois l'allocation et la copie, l'appel à strcpy
semble superflu.
hmm ... en fait je lis depuis un post que strdup va faire une chaîne ou la copier et retournera son adresse, donc strcpy devrait être capable d'attraper cette adresse et de la copier. – lokesh
Vous ne comprenez pas. 'strdup' alloue de la mémoire. Cela est ensuite passé à 'strcpy', mais' strcpy' ne libère pas cette mémoire puisque ce n'est pas son travail. Ainsi, la mémoire allouée par 'strdup' n'est jamais libérée. –
oh l'a obtenu merci ..... parce que nous n'avons pas d'adresse stockée du nouveau tableau alloué, nous ne serons jamais en mesure de supprimer cela: D – lokesh
Le problème est strdup
appelle malloc()
à l'intérieur et transmet le pointeur résultant à votre code. Votre code ne prend pas en charge la mémoire allouée et il est divulgué. Vous code fait à peu près ceci:
char* duplicate = malloc(strlen(p)+1); //first part of strdup
memcpy(dupliate,p); //second part of strdup
memcpy(a, duplicate);//memcpy in your code
le code ci-dessus ne pas free()
mémoire pointée par duplicate
.
strdup faire quelque chose de similaire à ce (Extrait de paxdiablo's answer here): -
char *strdup (const char *s) {
char *d = malloc (strlen (s) + 1); // Allocate memory
if (d != NULL)
strcpy (d,s); // Copy string
return d; // Return new memory
}
fuite SO la mémoire qui a été allouée à l'intérieur strdup conduit à cette erreur
Mate, si vous voulez "soulever" mon code, créditez-moi (http://stackoverflow.com/questions/252782/strdup-what-does-it-do-in-c/252802#252802) ou déguiser le fait avec un peu d'édition :-) Juste une blague, mais je viens juste de revenir en arrière et édité cette réponse récemment, donc je l'ai reconnu instantanément. – paxdiablo
ce que le diable sont. –
rien: D réellement juste commencé la programmation, tout en lisant des formulaires j'ai vu cette fonction essayé quelques combinaisons ... (juste pour le fun) – lokesh
Selon vos besoins, vous devriez faire soit 'a = strdup (p); '(' a' est maintenant alloué dynamiquement) ou 'strcpy (a, p);' (suppose que 'a' pointe déjà vers un tampon de taille suffisante). La combinaison de ces appels est inutile. – visitor