2017-01-21 16 views
0

私は参照カウントによって管理される(ACE_Event_Handlerから派生した)正確なレガシークラスを持っています。shared_ptrとカスタム参照カウントを同時に使用するには?

自分のコードでstd :: shared_ptrを使用して管理できるようにしたいが、古いレガシーリファレンスカウントを維持する(shared_ptrを受け入れないサードパーティのライブラリがクラスのオブジェクトにアクセスする必要がある - ACE、正確には)。

参照カウントが0になり、それを管理しているすべてのshared_ptrインスタンスが破棄されると、オブジェクトを削除する必要があります。

私は1つの考え方しか持っていません。shared_ptrのインスタンスは、参照カウントが0になるまでオブジェクトをポイントしてからリセットしてください。どういうわけか、これは汚い感じ。より良い方法がありますか?

+0

ACE参照カウントの増分と減分を処理するスマートポインタを作成して使用してみませんか?十分に簡単です。 –

+0

私はstd :: shared_ptrを使いたいと思います。 – Gbr

+0

['boost :: intrusive_ptr'](http://www.boost.org/doc/libs/1_63_0/libs/smart_ptr/intrusive_ptr.html)のようなものは、' std :: shared_ptr'よりも適しているようです。 boostがオプションでない場合、あなた自身の 'instrusive_ptr'のようなクラスをローリングすることはおそらくあなたの唯一のオプションです。 –

答えて

0

通常の方法は、コンストラクタ内にACE_Event_Handler::add_ref()とデストラクタ内にACE_Event_Handler::release()という独自のカスタムptr実装を持つことです。

また、あなたはカスタムデリータとstd::unqiue_ptrを使用することができます。

template<typename T> 
struct custom_releaser 
{ 
    void operator()(T *p) { if (p) p->release(); } 
}; 

std::unique_ptr<T, custom_releaser<T>> my_ptr; 

あなたが本当にstd::shared_ptrをしたい場合は:それは正しくACE_Event_Handler::add_ref()を呼び出します場合

std::shared_ptr<T> ptr = std::shared_ptr(std::move(my_ptr)); 

私は、しかし、疑問に思います。おそらく、std::shared_ptrは、それ自身のメンバー変数に基づいてカウントされるので、ACE_Event_Handler::add_ref()のメソッドを用意してインスタンスを作成し、参照カウントを追加する必要があります。

関連する問題