戻り値の型が char* である関数から strdup を返したい場合、メモリ リークのリスクまたは可能性は何ですか?
char* fun () {
return strdup("hello");
}
int main() {
for(;;)
printf("%s\n", fun());
}
strdup()
後で で解放する必要がある、新しく割り当てられたメモリへのポインタを返しますfree()
。それを呼び出さないと、メモリリークが発生free()
します—これは、あなたの例ではそうではありません。
ヒープに割り当てられたchar
ポインターを右辺値として返すため、指定した例に示すように、ユーザーはそれを解放するのを忘れる可能性があります。
printf("%s\n", fun()); // memory leak
// this is fine
char* string = fun();
printf("%s\n", string);
free(string);
パラメーターへのポインターを要求してchar*
割り当てたほうがよいでしょう。
このようなポインターを本当に返したい場合で、C++ を使用している場合は、使い終わったときに文字列std::unique_ptr<char>
を削除するカスタム デリーターを使用できます。free
unique_ptr<char, void (*)(char *)> fun () {
return {strdup("hello"), std::free};
}
// then you can use it
printf("%s\n", &*fun());
マニュアルページから:
strdup() 関数は、文字列 s の複製である新しい文字列へのポインタを返します。新しい文字列のメモリは malloc(3) で取得され、free(3) で解放できます。
つまり... strdup は、解放する必要があるメモリを割り当てます。つまり、所有権があります。