1. ホーム
  2. c

[解決済み] ダブルフリーとはどういう意味ですか?

2022-03-09 01:10:21

質問

タイトルの通り、私はC言語を始めたばかりで、もうすぐ中間テストがあります。現在過去問で復習しているのですが、繰り返し出てくるテーマがダブルフリー問題です。を呼び出す処理であることは理解しています。 free() を同じメモリ位置で2回表示させたいのですが、いくつか質問があり、どう答えていいのか100%わかりません。

質問1:C言語のダブルフリーの結果はどのようなもので、なぜそれが問題なのですか?

二重解放が発生します。

char* ptr = malloc(sizeof(char));

*ptr = 'a';
free(ptr);
free(ptr);

これに対する私の回答は、0x0のメモリアドレスが返されて、システムが不安定になる・クラッシュする、というものです。また、私の記憶が正しければ、ダブルフリーは実際には malloc バッファオーバーフローが2回発生し、システムが脆弱になります。

この質問を簡潔にまとめると、どのようになりますか?

質問2:特に導入が容易な状況を説明しなさい。 Cのダブルフリー?

ポインタの受け渡しの際に、ある関数で誤って解放してしまい、また気づかずに解放してしまうことがあるのではないかと思ったのですが?

繰り返しになりますが、これをまとめると "best"な方法は何でしょうか?

どのように解決するのか?

C言語のダブルフリーは、技術的に言えば、次のようになります。 未定義の動作 . これは、プログラムが完全に任意の動作をすることができ、何が起こるかわからないということを意味します。これは確かに悪いことだ! 実際には、メモリブロックをダブルフリーにすると、メモリマネージャの状態が破壊され、既存のメモリブロックが破壊されたり、将来の割り当てが奇妙な方法で失敗したりするかもしれません (たとえば、同じメモリが 2 つの異なる malloc ).

二重解放は、あらゆる種類のケースで発生します。よくあるのは、複数の異なるオブジェクトが互いにポインタを持ち、そのポインタが free . このような場合、注意しないと free の場合、オブジェクトのクリーンアップ時に同じポインタが複数回表示されます。他にもいろいろなケースがあるんですけどね。

お役に立てれば幸いです。