2013-06-15 5 views
9

私は手動で参照カウントの構造体を大量に使用するC++に移植しているCライブラリを持っています。私はshared_ptrを使って参照カウントを自動的に処理することを考えましたが、私はC APIを維持したいと思っています。Cインタフェースでshared_ptrを使用していますか?

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

私はshared_ptrを使用する場合は、効果的にCのAPIで、このマニュアルの参照カウントを公開する方法があります:古い署名はこのような何かを見て?

+1

shared_ptrが 'object_create'から得られた生ポインタをラップし、関連する時刻に' object_release'を呼び出させたいのですか? –

+0

@OliCharlesworthいいえ、私は 'Object'をC++の(構造体の代わりに)クラスとして再インプリメントしています。私はC++コード内で' shared_ptr'を使っています。私はそれがshared_ptrから生のポインタを取得することが可能で、それでも何とかしてもshared_ptrのrefcountで動作するようにしたい場合は興味があります。 –

+2

[Boost.intrusive_ptr](http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/intrusive_ptr.html)を使用する方が良いかもしれません。 – Angew

答えて

5

shared_ptrの問題は、すでに分かっているように、インスタンスを構築または破棄する以外は参照カウントを変更できないことです。だから、参照カウントがゼロになるまでをすべての構成に維持すること以外はこれを行う方法はありませんが、そのようにすると参照カウントの多くをやり直す必要があります。

多分boost::intrusive_ptrが良い選択です。

1

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

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

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

Cで書かれたクライアントコードがCライブラリを使うと思うなら、これらの関数を完全に削除して内部的にすべて処理することができます。 C apiとの互換性のために生ポインタを用意することができますが、すべての生涯管理はshared_ptrで自動的に処理できます。

+0

参照カウントはC側で自動的に維持されません。 'Object'への最後の' shared_ptr'が破棄されてもそれを指し示す 'Object *'がまだ残っていれば、そのオブジェクトは破壊され、Cポインタはダングリングのままです。 –

+0

実際には、私はオブジェクトのビューアとして使用されている生のポインタを考えていました、 'shared_ptr'がオブジェクトの存続時間を処理すると仮定しました。 – Uflex

関連する問題