5

古い質問ですが、まだいくつか考えがあります。

char * getarrmal(void)
{
    char *str;
    str = (char *)malloc(10);
    str[0] = 'a';
    str[1] = 'b';
    str[2] = 'c';
    str[3] = '\0';
    return str;
}

char * getarrdef(void)
{
    char *str = "hello";
    return str;
}

char * getarrfix(void)
{
    char str[10] = "world";
    return str;
}

3つの機能。最初の 2 つは文字列アドレスを返し、文字列はヒープに格納されるため、main() 関数などで引き続き使用できます。

最後の関数では、str はローカル変数であり、返された str は使用できません。

私の質問は、最初の 2 つを呼び出している関数に戻ったときに、それらを手動で解放する必要があるかどうかです。malloc の場合はそうであると信じるのは簡単ですが、char *str = "hello" の場合もそうであるかどうかはわかりません。

getarrdef() を使用し、その戻り値を解放しないと、何らかの形でメモリ リークが発生しますか?

4

1 に答える 1

4

いいえ、絶対に 2 番目のものを解放しようとしないでください。これはヒープに格納され、むしろ文字列リテラルであり、解放しようとすると未定義の動作になります。からC++11 7.21.3.3 The free function:

...引数がメモリ管理関数によって以前に返されたポインターと一致しない場合、または解放または再割り当ての呼び出しによってスペースが解放された場合、動作は未定義です。

最初のものについては、はい、割り当てられたメモリの責任をメモリ自体と一緒に渡すことをお勧めします。つまり、何かがそれを割り当ててあなたに与えた場合、あなたはそれを解放する責任があります。

次のような関数に戻して解放したとしてもdelarrmal()、これは当てはまります。

于 2013-04-24T03:42:02.067 に答える