9

手動で参照カウントされた構造体を多用する C++ に移植している C ライブラリがあります。参照カウントを自動的に処理するために使用することを検討しましshared_ptrたが、C API も維持したいと考えています。古い署名は次のようになります。

Object* object_create(void);
Object* object_retain(Object* o);
void object_release(Object* o);

を使用する場合shared_ptr、この手動参照カウントを C API で効果的に公開する方法はありますか?

4

3 に答える 3

7

shared_ptr既に理解されているように、の問題は、インスタンスを構築または破棄する以外に参照カウントを変更できないことです。いいえ、参照カウントがゼロになるまでshared_ptrto every を構築し続ける以外にこれを機能させる方法はありませんが、それを正しく行うには参照カウントの多くをやり直す必要があるため、ほとんど得られません。Object

おそらくboost::intrusive_ptr、より良いオプションです。

于 2013-06-15T18:00:52.473 に答える
1

を使用std::shared_ptr::getして、ポインタの値を取得できますobject_create

object_retainまたはobject_releaseによってすでに自動的に処理されているため、維持する必要があるかどうかはわかりませんshared_ptr

ライブラリを C コードで使用しますか? もしそうなら、@Angewが彼のコメントで指摘したように、Boost.intrusive_ptrを見てください。それが最良の選択のようです。

C で記述されたクライアント コードが C ライブラリを使用すると想定できる場合 (これはある程度理にかなっていると思います)、これらの関数を完全に削除して、すべてを内部で処理することができます。必要に応じて、C api との互換性のために生のポインターを提供できますが、すべての有効期間の管理は で自動的に処理できますshared_ptr

于 2013-06-15T17:46:29.123 に答える