0

次のコードでは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()は実際に問題を引き起こしました。誰かがこれを読んだことがあるなら、上記のコードは完全に有効です。

4

1 に答える 1