1

次のシナリオを想定します。

while(!notTheEnd) {
char str[1024];
char* ptr_to_str;


/* some strcat, strcpy on str */

ptr_to_str = str;

chmod(ptr_to_str, 0777);
}

メモリリークを回避するために、char * ptr_to_str = NULLを設定して解放する必要がありますか?

私が考えていた理論上の質問です。

4

4 に答える 4

8

あなたはあなたがしたことだけをしなければなりfree()ませんmalloc()。したがって:いいえ。

free()のマンページも参照してください。

free()関数は、ptrが指すメモリ空間を解放します。これは、malloc()、calloc()、またはrealloc()への以前の呼び出しによって返された必要があります。それ以外の場合、またはfree(ptr)が以前に呼び出されている場合は、未定義の動作が発生します。ptrがNULLの場合、操作は実行されません。

他の関数がmalloc()内部で使用するか、同様に使用する可能性があるため、返されたバッファを解放する必要があることに注意してください(例:strdup)。

ポインタをに設定するNULL必要はまったくありません。free()ただし、このポインタでの後続の呼び出しはアプリケーションを未定義の動作にさらさないため、いくつかの便利さが追加されます。また、一貫して実行すると、ポインタが実際にオブジェクトを指しているかどうかを確認できます。

于 2012-05-16T07:41:48.677 に答える
4

電話をかけたことmalloc()がないので、電話する必要はありませんfree()

あなたが持っているのはスタック上の文字配列へのポインタであり、明示的な割り当て解除は必要ありません。

于 2012-05-16T07:41:54.227 に答える
3

いいえ、(ヒープ上で)メモリを割り当てない限り、メモリを解放する必要はありません。いくつかの例外(などstrdup)がありますが、これが一般的なルールです。

于 2012-05-16T07:42:21.133 に答える
1

char str[1024]現在のスタックに1024バイトを割り当てます。そして、このスペースは、関数が戻るときに自動的に「ポップアウト」されます。したがって、このメモリを明示的に解放する必要はありません。

于 2012-05-16T08:26:27.127 に答える