8

重複の可能性:
解放後に変数をNULLに設定…

私は優れたCプログラミング手法について学んでおり、友人は、ポインターをfree()した後(または特定の解放関数を呼び出した後)は常にポインターをNULLに設定するように言ってきました。

例えば:

char* ptr = malloc(100);
...
free(ptr);
ptr = NULL;

また

struct graph* graph = create_graph();
...
destroy_graph(graph);
graph = NULL;

なぜこれが良い習慣なのですか?

更新:答えを読んだ後、それは私にはひどい習慣のようです!double-free()エラーの可能性を隠しています。どうすればこれが良い習慣になるのでしょうか?びっくりしました。

ありがとう、BodaCydo。

4

4 に答える 4

14

傷つけることはできませんが、必ずしも役立つとは限りません。考慮すべき問題は、ポインタの複数のコピーが存在するのは簡単であり、ほとんどの場合、1つだけをNULLに設定することになるということです。それがまったく役に立たない典型的な例は次のとおりです。

void free_graph(graph *g)
{
    ...
    free(g);
    g = NULL;  // not useful in this context
}

ここでの問題は、ローカルのポインタのみfree_graphをNULLに設定していて、そのポインタがの呼び出し元によって保持されてfree_graphいる場合でも、元の値が保持されることです。

于 2010-07-29T18:32:08.370 に答える
6

これは、free() が実行された後に誤ってメモリにアクセスするのを防ぐため、良い方法と考えられています。

于 2010-07-29T18:30:48.047 に答える
2

私からの悪い習慣の投票。値を割り当てたい場合は、(void*)0xdeadbeef に設定します。ただし、最初に CRT で何ができるかを確認してください。適切なデバッグ アロケータは、解放されたメモリを、解放された後にポインタが使用されたときに爆弾を引き起こす可能性が高いパターンに設定します。とはいえ、保証されているわけではありません。しかし、ポインターの値を変更しない方が、より優れた (そしてより高速な) ソリューションです。

于 2010-07-29T18:49:39.110 に答える
-5

私はイエスと思う ...

Menoryの一部の使用が終了したら、それをfree()する必要があります。これにより、解放されたメモリを他の目的で使用できるようになります...他のmalloc()呼び出しなど。

Freeは、引数としてメモリへのポインタを取り、ポインタが参照するメモリを解放します...

お役に立てれば ... :)

于 2010-07-29T18:28:37.843 に答える