質問: some_function_return_char_pointer(x); //OR malloc(nbytes); //do some stuff free(tmp);//this is where I get the error, but only sometimes } ``` xがNULLであるなどの明白なことを確認しましたが、そうではありません。それはちょうどランダムな線でクラッシュします。 しかし、私の本当の質問は、 - **無料()**をいつ使う必要があるのですか?あるいは、おそらくより正確に、いつ私は無料で使うべきではありませんか? mallocが関数内にあり、malloc()を使ったvarを返すとどうなりますか? forループまたはwhileループはどうですか?構造体の配列に対するmallocingは、文字列/ charポインタと同じ規則を持っていますか? プログラムのクラッシュ時にgccに入っているエラーから、私はmallocとfreeを理解していないだけです。私はGoogleと質の高い時間を過ごしましたが、まだ私はレンガの壁に当たっています。あなたが見つけた良い資源はありますか?私が見ているすべては、mallocを使うたびに無料で使う必要があると言います。しかし、私はそれを試み、私のプログラムはクラッシュします。変数のスコープに基づいて異なるかもしれません。変数が内部で宣言されているとき、Cはループの終わりにメモリを解放しますか?関数の終わりに? そう: ``` for(i=0;i<100;i++) char *x=malloc(n);//no need to use free(x)? ``` しかし: ``` char *x; for(i=0;i<100;i++) { x=malloc(n); free(x); //must do this, since scope of x greater than loop? } ``` そうですか? うまくいけば私は意味を作っている...
回答: メモリリークをしたくない場合は、メモリをmallocから解放する必要があります。 それは非常に扱いにくいことがあります。たとえば、`//do some stuff` に `continue` がある場合、フリーはスキップされ、メモリリークが発生します。それは扱いにくいので、C ++にはshared_ptrがあります。 Cプログラマーの給与はC ++プログラマーよりも高いという噂があります。 ときどきメモリリークに気をつけません。メモリが実行の全期間中必要なものを保持している場合は、解放しないことを選択できます。例:環境変数の文字列。 PS: Valgrind は、メモリのバグを検出するのに役立つツールです。メモリリークに特に便利です。