8

boost::intrusive_ptrが必要intrusive_ptr_add_refでありintrusive_ptr_release、定義する必要があります。これを行う基本クラスが提供されないのはなぜですか?ここに例があります:http://lists.boost.org/Archives/boost/2004/06/66957.phpですが、ポスターには「これが必ずしも良い考えだとは思わない」と書かれています。なぜだめですか?

更新:このクラスが多重継承で誤用される可能性があるという事実は十分な理由ではないと思います。独自の参照カウントを持つ複数の基本クラスから派生するクラスでも、同じ問題が発生します。これらのrefcountが基本クラスを介して実装されているかどうかは、違いはありません。

マルチスレッドに問題はないと思います。boost::shared_ptrアトミック参照カウントを提供し、このクラスも可能です。

4

3 に答える 3

4

これは、addとreleaseをすでに実装しているクラスでintrusive_ptrを使用できるようにするためです。

于 2010-05-25T10:08:50.843 に答える
4

Boostはそのための機能を提供します。スレッドセーフまたはスレッドセーフでない再カウント用に構成できます。

#include <boost/intrusive_ptr.hpp>
#include <boost/smart_ptr/intrusive_ref_counter.hpp>

class CMyClass
    : public boost::intrusive_ref_counter<
                               CMyClass,
                               boost::thread_unsafe_counter>
     ...

boost::intrusive_ptr<CMyClass> myPtr;

http://www.boost.org/doc/libs/1_62_0/libs/smart_ptr/intrusive_ref_counter.html

于 2016-10-07T22:39:16.147 に答える
3

問題は多重継承にあります。このベースを実装する2つのオブジェクトから継承する場合、単一のオブジェクトに対して2つのカウンターがあります...これは大混乱を引き起こす可能性があります。

ptr_addしたがって、派生クラスがオーバーライドを実装して複数のカウンターを一度に適切に同期できるように、メソッドとメソッドを仮想化する必要がありptr_releaseます...特にほとんどの場合完全に不要であるため、ここではパフォーマンスが低下します(結局のところ、多重継承にのみ役立つからです。

そしてもちろん、マルチスレッド環境では、(短時間で)非同期カウンターを使用できます(最初のカウンターはインクリメントされましたが、2番目のカウンターの前にスレッドが中断されました)それが引き起こす可能性のある問題はまだ考えられませんが、それは正気の状況ではありません。

また、クラスにクラッターを追加します。一部のクライアントは、結局参照カウントを必要としない場合があります(スタック上にオブジェクトを作成する場合)。

私はそれは良い考えではないと思います;)

于 2010-05-25T09:26:55.013 に答える