2013-11-15 12 views
5

私は鉱山の学習プロジェクト(C言語)に取り組んでおり、それをC++に移行して余分な学習のポイントを得ようと考えていました。その中には、特定のオブジェクト群のためのガベージコレクションシステムが含まれています。これは、Cでは、通常は大きなmalloc/mmapで実装し、簡単な素朴なマークアンドスイープで行います(参照やそのようなものを特定できます既に)。おもちゃのガベージコレクション:オペレータの新規/削除は十分ですか?

私の問題は、そのアイデアをC++に移植することを検討していましたが、メモリ管理スキームの理解が十分に安全ではないと感じています。

これまで私は、大きなメモリプールを割り当てて演算子newとoverloadingを基本クラスで削除し、自分のメモリプールのグラブ/リリース関数を呼び出し、ガベージコレクタの掃引フェーズでオブジェクトを削除してみました。それで十分ですか?私がここで見逃している隠された落とし穴は何ですか?

編集:明らかにするために、私は割り当てられたオブジェクトの寿命を把握することができるので、gc abiを使う必要はありません。オブジェクトはめったにC++コードで操作されず、それらを使用するコードはスタックを検査する必要なしに使用されていることを通知することができます。

+0

これについてはBjarne Stroustrupのコメントを参考にしてください。http://www.stroustrup.com/C++11FAQ.html#gc-abiまた、Hans Boehmのページへのリンクもあると思いますそれは優れた出発点です。 –

答えて

1

クラスを変更する場合は、構築中にGCに登録し、削除中に登録を解除する新しい基本クラスから継承しないようにしてください。マネージャークラスは本を保管します。

template <class parent> class BASE_GC { 
    BASE_GC() { /* register address and name*/} 
    ~BASE_GC() { /* unregister*/} 
}; 

親クラス名は型ID(*本).nameの()に由来することができます。 ベースクラスは、テンプレートすることができます。基本クラス名には親の名前が含まれています。

+0

これは私が本当に必要とするすべてを行うかもしれません。単純にGCの簿記を行う代わりに、私が別の割り当て戦略を使って遊ぶために別のアロケータを使うことにした場合、新しい演算子と削除をオーバーライドするだけの競合はありますか?その後、私がオペレータnewをオーバーライドすると、メモリオペレータの代わりにコンストラクタ/デストラクタにGCの簿記を保存することは理にかなっていますか? –

関連する問題