60

shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe)) へのポインタを必要とするCスタイルの関数を呼び出す必要があるようなものがありますType。からどうやって入手するのshared_ptr

4

3 に答える 3

150

get()次の方法を使用します。

boost::shared_ptr<foo> foo_ptr(new foo());
foo *raw_foo = foo_ptr.get();
c_library_function(raw_foo);

ライブラリ関数が実行される前に、スコープから外れないように注意してください。shared_ptrそうしないと、ライブラリが削除された後にポインタを使用して何かを実行しようとする可能性があるため、問題が発生する可能性があります。ライブラリ関数が戻った後に生のポインタのコピーを保持する場合は特に注意してください。

于 2009-02-02T22:04:50.530 に答える
36

&これを行う別の方法は、 and*演算子の組み合わせを使用することです。

boost::shared_ptr<foo> foo_ptr(new foo());
c_library_function( &*foo_ptr);

個人的にはget()メソッドを使用することを好みますが (実際には正しい答えです)、このメソッドの利点の 1 つは、オーバーロード(ポインター逆参照) するがメソッドoperator*を提供しない他のクラスで使用できることです。get()たとえば、ジェネリック クラス テンプレートで役立つ場合があります。

于 2009-02-02T22:41:11.563 に答える