[解決済み] 割り当てられたメモリにfree()を使わなくても良いことがありますか?
質問
私はコンピュータ工学を勉強していますが、電子工学の授業もあります。このコースの)2人の教授によると、このコースでは
free()
関数の使用を避けることが可能であるということを(そのコースの
malloc()
,
calloc()
など) に割り当てられたメモリ空間は、他のメモリを割り当てるために再び使用されることはない可能性が高いからです。つまり、例えば 4 バイトを割り当ててそれを解放した場合、4 バイトのスペースができますが、これはおそらく二度と割り当てられないでしょう。
穴
.
私はそれはおかしいと思います。
ノットトイプログラム
で、メモリを解放せずにヒープ上に割り当てるようなことはできません。しかし、なぜそれがそんなに重要なのかを正確に説明する知識はないので、それぞれの
malloc()
が存在しなければならない理由を正確に説明する知識がありません。
free()
.
ということは
malloc()
を使わずに
free()
? そして、そうでない場合、私は教授にどのようにこれを説明することができますか?
どのように解決するのですか?
簡単です。
malloc()/free()
の実装のソースを読めばいいのです。これによって、私は実際の
メモリマネージャ
のことです。これは、ランタイムライブラリ、仮想マシン、またはオペレーティングシステムにあるかもしれません。もちろん、コードはすべてのケースで同じようにアクセスできるわけではありません。
隣接するホールをより大きなホールに結合することによって、メモリが断片化されないようにすることは、非常に一般的です。より本格的なアロケータは、これを確実にするために、より本格的なテクニックを使用します。
そこで、3回の割り当てと解放を行い、この順序でメモリにブロックをレイアウトしたと仮定してみましょう。
+-+-+-+
|A|B|C|
+-+-+-+
個々のアロケーションのサイズは問題ではありません。そして、最初と最後の1つ、AとCを解放します。
+-+-+-+
| |B| |
+-+-+-+
を最終的にBを解放すると、(最初は、少なくとも理論上は)結局のところ
+-+-+-+
| | | |
+-+-+-+
に分割することができます。
+-+-+-+
| |
+-+-+-+
すなわち、単一の大きなフリーブロックであり、フラグメントは残っていません。
要求されたように、リファレンス。
- のコードを読んでみてください。 dlmalloc . 私はより高度な、完全な製品品質の実装です。
-
組み込みアプリケーションでも、デフラグメントの実装は可能です。例えば
に関するこれらのノートを参照してください。
heap4.c
のコード .
関連
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] Pythonで明示的にメモリを解放するにはどうしたらいいですか?
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み】ローカル変数のメモリはスコープ外からアクセスできる?
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された