1. ホーム
  2. c++

[解決済み] 割り当てられたメモリにfree()を使わなくても良いことがありますか?

2023-05-27 12:32:16

質問

私はコンピュータ工学を勉強していますが、電子工学の授業もあります。このコースの)2人の教授によると、このコースでは free() 関数の使用を避けることが可能であるということを(そのコースの malloc() , calloc() など) に割り当てられたメモリ空間は、他のメモリを割り当てるために再び使用されることはない可能性が高いからです。つまり、例えば 4 バイトを割り当ててそれを解放した場合、4 バイトのスペースができますが、これはおそらく二度と割り当てられないでしょう。 .

私はそれはおかしいと思います。 ノットトイプログラム で、メモリを解放せずにヒープ上に割り当てるようなことはできません。しかし、なぜそれがそんなに重要なのかを正確に説明する知識はないので、それぞれの malloc() が存在しなければならない理由を正確に説明する知識がありません。 free() .

ということは malloc() を使わずに free() ? そして、そうでない場合、私は教授にどのようにこれを説明することができますか?

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

簡単です。 malloc()/free() の実装のソースを読めばいいのです。これによって、私は実際の メモリマネージャ のことです。これは、ランタイムライブラリ、仮想マシン、またはオペレーティングシステムにあるかもしれません。もちろん、コードはすべてのケースで同じようにアクセスできるわけではありません。

隣接するホールをより大きなホールに結合することによって、メモリが断片化されないようにすることは、非常に一般的です。より本格的なアロケータは、これを確実にするために、より本格的なテクニックを使用します。

そこで、3回の割り当てと解放を行い、この順序でメモリにブロックをレイアウトしたと仮定してみましょう。

+-+-+-+
|A|B|C|
+-+-+-+

個々のアロケーションのサイズは問題ではありません。そして、最初と最後の1つ、AとCを解放します。

+-+-+-+
| |B| |
+-+-+-+

を最終的にBを解放すると、(最初は、少なくとも理論上は)結局のところ

+-+-+-+
| | | |
+-+-+-+

に分割することができます。

+-+-+-+
|     |
+-+-+-+

すなわち、単一の大きなフリーブロックであり、フラグメントは残っていません。

要求されたように、リファレンス。