-6

C または C++ のガベージ コレクターがどのように機能するかを確認できますか?

使用されていないメモリ内の値を選択する背後にあるアルゴリズムは何ですか?

GC が C でどのように機能するか教えてもらえますか?

4

5 に答える 5

5

C および C++ にはガベージ コレクションがありません。

于 2012-11-16T06:58:25.467 に答える
4

どちらの言語にもガベージ コレクタはありません。少なくとも、標準準拠の実装の一部としてではありません。

C++ にはガベージ コレクションの実装を困難にする言語制限があったことに注意してください。これらの規則の一部は、最新の標準である C++11 で緩和されています。したがって、原則として、標準に準拠した C++ ガベージ コレクターを実装することが可能になります。

C++ での標準的なアプローチは、スマート ポインターを使用してメモリを自動的に管理することです。

ここに興味深い記事があり、いくつかの便利なリンクが含まれています。コメントから、GC を慣用的な C++ と調和させることがいかに難しいかがわかるかもしれません。

于 2012-11-16T06:58:39.067 に答える
3

この論文/記事を確認してください: Hans BoehmによるC および C++ のガベージ コレクター

于 2012-11-16T06:59:27.773 に答える
2

標準の C および C++ にはガベージ コレクションのサポートはありませんが、 Boehm-Demers-Weiser の保守的なガベージ コレクタと呼ばれる、一般的で移植性の高い実装が少なくとも 1 つあります。

保守的なガベージ コレクターは、たとえば実際には整数であっても、ポインターのように見えるものはすべてポインターであると想定して動作します。そのため、参照されていないオブジェクトの回収に失敗することがあります。また、ポインターを xor するなどのいくつかのトリックにより、ポインターをそれらから隠すことができます。しかし、私の経験では、実際にはかなりうまく機能しているようです。

于 2012-11-16T07:04:04.567 に答える
0

C では、ガベージ コレクションは完全に手動です。割り当てられた関数または関連する関数を追跡して、終了したらmalloc()解放できるようにする必要がfree()あります。これは自動的には行われません。

C++ は一般的に同じです。deleteで割り当てられたものnew(および でdelete[]割り当てられた配列)が必要ですnew[]。ただし、このプロセスは、動的リソースを管理するオブジェクトを作成し、それらをデストラクタで解放することにより、部分的に自動化できます (また自動化する必要があります)。この手法は一般にRAIIとして知られており、最も一般的な例は、標準ライブラリのコンテナーとスマート ポインターです。

どちらの言語にも自動ガベージ コレクションはなく、動的オブジェクトが使用されているかどうかを判断する方法もありません。常に動的リソースを自分で管理する必要があります。ガベージ コレクションを提供する非標準の拡張機能がいくつかありますが、それらについては何も知りません。

于 2012-11-16T07:07:49.917 に答える