2011-09-09 3 views
4
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?

+5

ce que le diable sont. –

+0

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

+0

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

Répondre

10

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.

+0

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

+1

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. –

+0

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

2

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.

3

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

+0

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