2011-12-19 38 views
4

現在、参照カウント手法を使用して(C++で)ガベージコレクタを実装しています。しかし、重要な問題があるのは、データが循環参照されていると、参照カウントが常にゼロではないため、データが収集されないということです。C++のガベージコレクションと循環参照データ

ガベージコレクタ、マークアンドスイープアルゴリズムなどをトレースしていましたが、これを実装することは可能でしょうか?そして、彼らはどれくらい正確に機能していますか?

+2

弱い参照を参照してください。また、循環参照を完全に避けるようにしてください。 –

+0

これはよく形成された質問ではありません。もちろん、実装することもできますし、良いプログラミング言語の本を調べて、そのガベージコレクションアルゴリズムの仕組みを理解する必要があります。 –

+0

CPPとの合意:それについて考えるなら、真に対称な循環参照が存在することはありません。誰かがいつも最初に来なければならない。したがって、「サークル」の最終エッジは「弱い参照」でなければなりません。これは問題を解決します。 –

答えて

1

http://www.boost.org/doc/libs/1_48_0/libs/smart_ptr/weak_ptr.htm

すでにshared_ptrのが管理していますオブジェクト への弱参照 『「のweak_ptrクラステンプレートは保存する』。オブジェクトにアクセスするには、 のweak_ptrはshared_ptrのを使用してのshared_ptrに変換することができます コンストラクタまたはメンバ関数lock最後のshared_ptrを に変更してオブジェクトがなくなり、オブジェクトが削除されると、 オブジェクトを参照するweak_ptrインスタンスから shared_ptrを取得しようとすると失敗します。タイプの例外boost :: bad_weak_ptr、weak_ptr :: lockは空の shared_ptrを返します。

循環参照は実際にはありませんが、リファクタリングできないデザインで作業している場合(ときどき起こることがあります)、いずれかの方向に弱いポインタを配置してみてください破壊を防ぐことはできません。

+0

これは、ガベージコレクタなしでリソースを管理しているがOPにガベージコレクタを実装するのに役立たない場合は、良いアドバイスです。 –

+0

+1 - この答えは、文字通りの問題の背後にある問題を簡単に解決する方法として役立ちます。 –

+0

はい、現在のGCで発生している問題を解決しようとしています。ユーザーがそれを使用して循環リンクされたリストのようなものを制御すると、失敗します。 – IcySnow

3

これはガベージコレクタ設計の古典的な問題です。 Garbage Collection article on Wikipediaを見てください。ガベージコレクタデザインのさまざまなトレードオフを提示するのは本当に良いことです。三色マーキングのような「より進化した」アルゴリズムは、実際には非常に簡単で実装が簡単です。私はそれらの指示を使って、Cで自分自身のLisp実装のトレースコレクタを実装しました。

ガベージコレクタのトレースで扱う最も複雑なものは、オブジェクトツリーを歩いていることです(例えば、 "ライブ"オブジェクトへの参照を見つける)。別の言語用のインタープリタを作成している場合は、ルートオブジェクトクラス(または他の共通の分母ですべてのオブジェクト)にこれのための機能を配線することができるので、これはあまり難しくありません。しかし、C++用のガベージコレクタをC++で作成している場合は、他の割り当てられたメモリ領域へのポインタを見つけるためにオブジェクトの内容を調べる必要があるため、これを行うのは難しいでしょう。

教育目的でガベージコレクタを作成している場合は、別の言語(ポインタに直接アクセスできないもの)用のインタプリタを書くことを検討することをおすすめします。プロダクションソフトウェアでC++のコレクタをC++で使用する目的でC++のコレクタを作成する場合は、代わりにan existing production-quality implementationを使用することを強くお勧めします。