boost :: weak_ptrから生のポインタを取得することは可能ですか?Boostのshared_ptrにはget()メソッドと"->"演算子があります。weak_ptrが同じ機能を持たない理由はありますか?
3 に答える
Aweak_ptr
は非所有参照を保持しているため、それが参照するオブジェクトはもう存在しない可能性があります。が保持する生のポインタを使用することは、本質的に危険weak_ptr
です。
正しいアプローチは、を using に昇格weak_ptr
さshared_ptr
せweak_ptr::lock()
、そこからポインターを取得することです。
Boostweak_ptr
のドキュメントget()
には、の一部として機能を提供することが安全でない理由が説明されweak_ptr
ており、問題を引き起こす可能性のあるコードの例が示されています。
これは古い質問であり、受け入れられた答えは良いので、別の答えを投稿することを躊躇しますが、欠けているように見えるものの1つは、良い慣用的な使用例です。
boost::weak_ptr<T> weak_example;
...
if (boost::shared_ptr<T> example = weak_example.lock())
{
// do something with example; it's safe to use example.get() to get the
// raw pointer, *only if* it's only used within this scope, not cached.
}
else
{
// do something sensible (often nothing) if the object's already destroyed
}
このイディオムの主な利点は、強力なポインターがif-trueブロックにスコープされることです。これにより、初期化されていない参照が誤って使用されたり、実際に必要とされるよりも長く強力な参照が維持されたりするのを防ぐことができます。
生のポインタを取得する前に、最初に weak_ptr から shared_ptr を導出する必要があります。
lockを呼び出して、shared_ptr または shared_ptr コンストラクターを取得できます。
boost::weak_ptr<int> example;
...
int* raw = boost::shared_ptr<int>(example).get();