web-dev-qa-db-ja.com

shared_ptrから通常のptrを取得していますか?

shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe))のようなものがあります。今、Typeへのポインターを必要とするCスタイルの関数を呼び出す必要があります。 shared_ptrから取得するにはどうすればよいですか?

46
user34537

get() メソッドを使用します。

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

shared_ptrは、ライブラリ関数が処理される前に範囲外になりません。そうしないと、ライブラリが削除された後にライブラリがポインタで何かを行おうとするため、問題が発生する可能性があります。ライブラリ関数が返された後、生のポインタのコピーを保持する場合は特に注意してください。

132
Adam Rosenfield

もう1つの方法は、_&_および_*_演算子の組み合わせを使用することです。

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

個人的にはget()メソッドを使用したいと思いますが(これは本当に正しい答えです)、これが持つ利点の1つは、_operator*_(ポインター逆参照)をオーバーロードする他のクラスで使用できることです、ただしget()メソッドは提供しません。たとえば、汎用クラステンプレートで役立つ場合があります。

30
Michael Burr