2011-09-09 1 views
4
void x() 
{ 
    strcpy(a, strdup(p)); 
} 
のstrdupと

(エラー)配分、strcpyのは、それを解放しないSTRDUP()をし、strcpyの

誰もが上記の文と一緒に間違っていると、なぜ私はこのエラーを取得しています何を教えてもらえますか?

+5

。あなたは何をしようとしていますか? –

+0

何も:実際にはプログラミングを始めましたが、フォームを読んでいるうちにこの関数がいくつかの組み合わせを試してみました...(楽しみのため) – lokesh

+0

あなたの必要に応じて、 'a = strdup ( 'a'はすでに十分な大きさのバッファを指していると仮定します)'( 'a''は動的に割り当てられます)' strcpy(a、p); 'これらの呼び出しを組み合わせるのは無意味です。 – visitor

答えて

10

問題は、メモリがリークしていることです。 strdupを呼び出すと、解放されていないメモリが割り当てられます。 strcpyに渡されたメモリへのポインタは決してどこにも保存されないので、コンパイラはそれが漏洩していることを証明することができます。

strdupは割り当てとコピーの両方を実行しているため、何をしようとしているのか分かりません。strcpyの呼び出しは不必要なようです。

+0

hmm ...実際に私はstrdupが文字列を作るかコピーしてそのアドレスを返すので、strcpyはそのアドレスをキャッチしてコピーできるはずです。 – lokesh

+1

あなたはわかりません。 'strdup'はメモリを割り当てます。それは 'strcpy'に渡されますが、' strcpy'はそのメモリではないので、そのメモリを解放しません。したがって、 'strdup'によって割り当てられたメモリは決して解放されません。 –

+0

オハイオ州それを持っている.....私たちは、新しい割り当てられた配列のアドレスを保存しないので、それを削除することはできません:D – lokesh

2

問題はstrdupで、malloc()が呼び出され、コードに結果のポインタが渡されます。あなたのコードはその割り当てられたメモリの所有権を取らず、それは漏洩しています。あなたは、コードは大体このやっている:

char* duplicate = malloc(strlen(p)+1); //first part of strdup 
memcpy(dupliate,p); //second part of strdup 
memcpy(a, duplicate);//memcpy in your code 

に上記のコードを

free()メモリは duplicateによって指されていません。

3

これに似た何かをするのstrdupは(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 

}

はSOのstrdup内で割り当てられたメモリをリークすると、そのエラーにつながる一体が何であるかを

+0

メイト、私のコードを "持ち上げ"ようとするなら、私に信用するか(http://stackoverflow.com/questions/252782/strdup-what-does-it-do-in-c/252802#252802)、またはちょっと編集して事実を隠す:-)ちょうど冗談ですが、私はちょうど戻ってきて、その答えを最近編集したので、すぐにそれを認識しました。 – paxdiablo

関連する問題