次のコードではshared_ptr<A>
、関数から a を取得しています。次に、ポインターを派生クラスに動的にキャストし、shared_ptr<B>
. 元のポインタは ではありませんnullptr
。
shared_ptr<B> storage = nullptr;
if (...)
{
shared_ptr<A> definition = getSharedPointer();
// Store the lambda
storage = dynamic_pointer_cast<B>(definition);
}
dynamic_pointer_cast
and storage が合計参照カウントを 2 に増やすことを期待しstorage
ます。その後、if ステートメントのスコープを離れると、storage
の参照カウントは 1 になるはずです。
それでも、ストレージでメソッドを呼び出そうとすると、EXC_BAD_ACCESS が返されます。これは、削除されたポインターを読み込んでいることを意味します。
storage->foo(...)->bar(...);
私の論理は間違っていますか?これはclangのバグですか(想像できません)?
編集
ポインターとは関係のないエラーを見つけたようです。関数bar()
は実際に問題を引き起こしました。誰かがこれを読んだことがあるなら、上記のコードは完全に有効です。