1

次の点について疑問があります。

void *a = malloc(40);
free(a);

malloc(40) が 40 バイトのメモリを割り当て、このメモリのアドレスを返し、次に free(a) がこのメモリの割り当てを解除/解放すると考えると、そのメモリに存在するビット パターンには何もしません。したがって、おそらくこの同じメモリが void *b に割り当てられ、b が指すアドレスの値を印刷すると、存在していたのと同じ値が得られるか、ガベージ値が得られます。なぜですか?

4

7 に答える 7

5

この状況を念頭に置いていると思います:

void * a = malloc(40);
free(a);
void * b = malloc(40);

assert(a == b);

メモリは再利用される可能性が高いため、これは当然のことです。

ただし、 以来a == b、あなたは自分自身の質問に答えました: の値は の値bと同じですa!

私はあなたが間違った質問をしたと信じてます. それはまったく別のやかんです。2 つの呼び出しの間に何かが起こった可能性があります。何も保証されません。呼び出しの戻り値が指すメモリは初期化されておらず、その内容について推測することはできません典型的な最適化された C ライブラリでメモリが変更されないのは当然ですが、保証はありません。「安全な」ランタイム環境では、解放されたメモリまたは割り当てられたメモリを特定のテスト パターンで上書きして、無効なアクセスをより適切に検出できるようにすることを選択できます。bmallocmalloc

于 2012-09-26T11:55:05.857 に答える
3

それはあなたにどんな価値も与えることができます。
C/C++ 標準では、値を特定のものにすることは義務付けられていません。技術的に言えば、初期化されていない変数/メモリの値はIndeterminateです。

要するに、あなたのプログラムは、この値が特定のものであることに依存するべきではありません。

于 2012-09-26T11:50:25.700 に答える
0

関数free()が指定されたバイトを何らかのパターンに設定し、バイトが解放されて初期化されていないことをメモリに通知するため、ガベージ値が得られます。そうは言っても、質問で定義されたケースに遭遇する可能性は非常に低く、非常にありそうにありません。同じバイトが再び割り当てられたとしても、私を信じてください、あなたは決してそれらを認識しません:-)

AFAIK、free()は通常、VisualStudioでメモリを0xFE0xEEに設定します。これは、メモリが割り当てられたが、現在は解放されていることを意味します。これらの値はセンチネル値と呼ばれ、ヒープはまだプロセスによって所有されていますが、使用されていないことを意味します。プロセスから解放されたメモリは、「????」を表示します

于 2012-09-26T12:19:20.657 に答える
0

何も保証されていません。mallocから取得した印刷ブロックは、以前のデータを印刷する場合と印刷しない場合があります。次の malloc ブロックを変更したり (次のアドレスが異なるため)、古いメモリ ブロック自体を変更したりできるものはたくさんあります。

于 2012-09-26T11:56:15.247 に答える
0

free は、解放しているメモリを変更することがよくあります。

特にデバッグモードでは、メモリを二重に解放しているのか、解放されたメモリを操作しているだけなのかを簡単に判断できるように、メモリを固定パターンで自由に上書きするのが一般的なトリックです。

Likewise malloc might overwrite memory with a different pattern to make it obvious that the memory is uninitialised.

于 2012-09-26T11:57:19.910 に答える
0

malloc and free are C style memory management rather than C++. C++ alternatives are new and delete operators. As for the bit pattern remaining in the memory after free(), yes, it's the same bit pattern. If you want to manually delete the bit pattern, you can use memset() or ZeroMemory() if you write WinApi code.

于 2012-09-26T11:57:20.947 に答える
-1

まず、コードは c++ ではなくプレーンな c です。

その理由は、free()/deleteがそこに存在するため、システムはメモリ領域が再び割り当て可能であることを認識できるからです。

なぜそれ以上のことをしなければならないのですか?

ただし、これはセキュリティ上の問題です。セキュリティ指向の最近のシステムの中には、メモリをアプリケーションに渡す前にゼロにするものがあると思います。malloc()初めて使用する場合は、 callocと同等のものを取得します。それでも、たまたまメモリを解放してから再度割り当てると、自分のデータを読み取れる可能性があります。

そのような行動の明白な理由は単純です。メモリをゼロにするのは時間がかかりますが、手動で行うことができます。実はO(n)複雑さがあります。メモリを再利用する数計算機を作成する場合、その後に何を取得するかは気にしません。これはmalloc()、ほとんどの場合上書きする必要があるためmemset()ですfree()

を呼び出した後に何もメモリを読み取ることができないことを確認したい場合は、呼び出す前freeに使用する必要があります。memset(a, 0, SIZE)free()

于 2012-09-26T12:01:46.840 に答える