一般的に、私は Google のスタイル ガイドに従います。これは、私が物事を見る方法とうまく一致していると感じています。また、ほぼ例外なく、boost::scoped_ptr を使用して、特定のオブジェクトの所有権を 1 人のマネージャーだけが持つようにしています。次に、裸のポインターを渡します。私のプロジェクトは、オブジェクトを使用するオブジェクトが破棄された後、そのオブジェクトのマネージャーが常に破棄されるように構造化されているという考えです。
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Smart_Pointers
これはすべて素晴らしいことですが、所有者を使用していたオブジェクトが削除される前に、所有者がたまたま削除されてしまうという厄介な小さなメモリストンプバグに噛まれました.
さて、みんなが私がこのパターンのばかだと飛び跳ねる前に、単に shared_ptr を使用しないのはなぜですか? など、未定義の所有者セマンティクスを持ちたくないという点を考慮してください。shared_ptr はこの特定のケースをキャッチできますが、システムのユーザーに間違ったメッセージを送信します。「誰がこれを所有しているのかわかりません。あなたかもしれません!」と書かれています。
私を助けたのは、スコープ付きポインターへの弱いポインターだったでしょう。実際には、スコープ付きポインターが破棄されると null になる弱参照のリストを持つスコープ付きポインター。これにより、単一所有権のセマンティクスが可能になりますが、使用中のオブジェクトに、私が遭遇した問題をキャッチする機会が与えられます。
したがって、scoped_ptr の追加の「weak_refs」ポインターと、weak_ptr の「next_weak_ptr」の追加ポインターを犠牲にして、きちんとした小さな単一所有者、複数ユーザー構造を作成します。
それはおそらく単なるデバッグ機能である可能性もあるため、「リリース」では、システム全体が通常のサイズの scoped_ptr と弱参照用の標準の単一ポインターに戻ります。
だから.....これのすべての後の私の質問は次のとおりです。
- stl/boost に既にそのようなポインター/パターンがありませんか、それとも自分でロールする必要がありますか?
- 私の単一所有権の目標をまだ満たしている、より良い方法はありますか?
乾杯、シェーン