1

文字列を返す関数を実装しました。パラメーター ( ) として整数を取り、ageフォーマットされた文字列を返します。

クレイジーなメモリリークがあるという事実を除いて、すべてがうまく機能しています。strdup() がこれの原因であることは知っていますが、いくつかの修正を調査しようとしましたが、役に立ちませんでした。

私のコードは次のとおりです。

const char * returnName(int age) {

    char string[30];

    sprintf( string, "You are %d years old", age);

    return strdup(string);
}

Valgrind の出力は次のとおりです。

==15414== LEAK SUMMARY:
==15414==    definitely lost: 6,192 bytes in 516 blocks
==15414==    indirectly lost: 0 bytes in 0 blocks
==15414==      possibly lost: 0 bytes in 0 blocks
==15414==    still reachable: 0 bytes in 0 blocks
==15414==         suppressed: 0 bytes in 0 blocks

このメモリ リークの問題を解決するための助けをいただければ幸いです。

4

5 に答える 5

5

strdup() は本質的に同等です

char* dup = malloc(strlen(original) + 1);
strcpy(dup, original);

free()そのため、文字列の使用が終了したら、忘れずに呼び出す必要があります。

const char* name = returnName(20);
/* do stuff with name */
free((void*)name);

を呼び出さない場合free()、もちろん valgrind はリークを報告します。

于 2015-10-19T22:10:48.393 に答える
3

からman strdup:

新しい文字列のメモリは で取得 されmalloc(3)、 で解放できますfree(3)

freeしたがって、によって割り当てられて返されるスペースが必要ですstrdup

returnName次のように呼び出すとします。

 const char* str = returnName(3);

完了しstrたら、次freeのようにできます。

free((char*) str);

非 constfreeが必要なため、キャストが必要です。実際には定数データ1を返す必要があるため、この明示的な変換はここでは問題ありません。呼び出しは、ここでは厄介な実装の詳細にすぎません。 void*returnNamefree


1この回答へのコメントで @MM と議論したとおり。

于 2015-10-19T22:09:10.517 に答える
3

strdupは次のようになります。

char *strdup(const char *str){
    size_t n = strlen(str) + 1;
    char *dup = malloc(n);

    if(dup){
        strcpy(dup, str);
    }

    return dup;
}

ご覧のとおり、そこにもmalloc関係があります。つまり、そのメモリを使用して動的に割り当てた後のある時点で、必要がなくなった後、それを使用strdupするfree必要があります。

于 2015-10-19T22:11:43.650 に答える