C または C++ のガベージ コレクターがどのように機能するかを確認できますか?
使用されていないメモリ内の値を選択する背後にあるアルゴリズムは何ですか?
GC が C でどのように機能するか教えてもらえますか?
C および C++ にはガベージ コレクションがありません。
どちらの言語にもガベージ コレクタはありません。少なくとも、標準準拠の実装の一部としてではありません。
C++ にはガベージ コレクションの実装を困難にする言語制限があったことに注意してください。これらの規則の一部は、最新の標準である C++11 で緩和されています。したがって、原則として、標準に準拠した C++ ガベージ コレクターを実装することが可能になります。
C++ での標準的なアプローチは、スマート ポインターを使用してメモリを自動的に管理することです。
ここに興味深い記事があり、いくつかの便利なリンクが含まれています。コメントから、GC を慣用的な C++ と調和させることがいかに難しいかがわかるかもしれません。
この論文/記事を確認してください: Hans BoehmによるC および C++ のガベージ コレクター
標準の C および C++ にはガベージ コレクションのサポートはありませんが、 Boehm-Demers-Weiser の保守的なガベージ コレクタと呼ばれる、一般的で移植性の高い実装が少なくとも 1 つあります。
保守的なガベージ コレクターは、たとえば実際には整数であっても、ポインターのように見えるものはすべてポインターであると想定して動作します。そのため、参照されていないオブジェクトの回収に失敗することがあります。また、ポインターを xor するなどのいくつかのトリックにより、ポインターをそれらから隠すことができます。しかし、私の経験では、実際にはかなりうまく機能しているようです。
C では、ガベージ コレクションは完全に手動です。割り当てられた関数または関連する関数を追跡して、終了したらmalloc()
解放できるようにする必要がfree()
あります。これは自動的には行われません。
C++ は一般的に同じです。delete
で割り当てられたものnew
(および でdelete[]
割り当てられた配列)が必要ですnew[]
。ただし、このプロセスは、動的リソースを管理するオブジェクトを作成し、それらをデストラクタで解放することにより、部分的に自動化できます (また自動化する必要があります)。この手法は一般にRAIIとして知られており、最も一般的な例は、標準ライブラリのコンテナーとスマート ポインターです。
どちらの言語にも自動ガベージ コレクションはなく、動的オブジェクトが使用されているかどうかを判断する方法もありません。常に動的リソースを自分で管理する必要があります。ガベージ コレクションを提供する非標準の拡張機能がいくつかありますが、それらについては何も知りません。