2016-11-21 3 views
0

私が読んでいたので、free()を使う必要がありますが、次に何が起こるのですか?私はそれのようなものを得たらどうですか?free()を使用して、後で何が起こっていますか?

char word[] = "abc"; 
char *copy; 
copy = (char*) malloc(sizeof(char) * (strlen(word) + 1)); 
strcpy(copy, word); 
free(copy); 
printf("%s", copy); 

私は "abc"と書いています。どうして?

+6

を解放されたメモリへのアクセス* *未定義の動作をトリガーします。 「理由」はありません。何でも起れる。 (そして 'malloc'の結果をキャストするのを止めます)。 – AnT

+0

[malloc/free]の重複の可能性があります。フリーのメモリから読み込むことができます](http://stackoverflow.com/questions/9673733/malloc-free-can-read-from-freed-memory) –

答えて

4

free()を使用した後、あなたのポインタcopyはまだ同じメモリ位置を指します。 free()は実際にメモリに書き込まれたものを実際には削除しませんが、メモリ管理にメモリのその部分をもう必要としないことを通知します。 それはまだそれがabcを出力する理由です。しかし、お使いのOSは、そのメモリを別のアプリケーションまたはアプリケーションに割り当てた新しいものに再割り当てする可能性があります。不運な場合は、セグメンテーション違反が発生します。ここで

+4

私はたぶん「あなたが幸運なら、あなたはセグメンテーションフォールト " – schil227

+0

あなたはもちろんそうです。あなたが不運な場合は、警告やエラーなしで使用済みのメモリを上書きします。不明なバグについては不思議です。 – clocktown

2

free()は、以前にcalloc、malloc、またはreallocによって割り当てられたメモリの割り当てを解除します。動作が定義されていないので、free'dされているメモリにアクセスすべきではありません。それはそれが以前の内容を保持しているだけの偶然の一致です。

ツールをvalgrindとして使用することをお勧めします。これは、(特に)割り付け解除されたメモリにアクセスしようとしているかどうかを示すことができます。 Linuxのターミナルでは、あなたはこのようにそれを行うことができます。

valgrind ./yourProgram

0

はそれが非常によくexplaynedさ:

C Reference -- free()

をメモリの割り当てを解除しても、データはもう存在しないという意味ではありません。

メモリは新しい割り当てのためだけに使用できます。

アクセスすると、定義されていない動作になります。

0

他の人は言ったように、コードが解放されたポインタを参照するときの動作は未定義です。この場合、あなたはそれを読んでいます。しかし、それへの書き込みは許されない可能性が高く、セグメンテーション違反があるはずです。

MALLOCDEBUG(例:AIXの場合はMALLOCDEBUG=validate_ptrs)またはプラットフォーム上の同様の環境変数を使用してこのエラーをキャッチすることをお勧めします。ただし、MALLOCDEBUGをオンにすると、プログラムに重大なパフォーマンスの影響が及ぶ可能性があります。代替はまた、以下に示すように、明示的にNULLに解放されたポインタを設定する独自の自由なルーチンの書き込みをされています

#define MYFREE(x) do { free((x)); (x) = NULL; } while(0);

関連する問題