次のコードでは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_castand storage が合計参照カウントを 2 に増やすことを期待しstorageます。その後、if ステートメントのスコープを離れると、storageの参照カウントは 1 になるはずです。
それでも、ストレージでメソッドを呼び出そうとすると、EXC_BAD_ACCESS が返されます。これは、削除されたポインターを読み込んでいることを意味します。
storage->foo(...)->bar(...);
私の論理は間違っていますか?これはclangのバグですか(想像できません)?
編集
ポインターとは関係のないエラーを見つけたようです。関数bar()は実際に問題を引き起こしました。誰かがこれを読んだことがあるなら、上記のコードは完全に有効です。