2

から派生したクラスをObjectコンテナに追加するこの関数があります。

template<class T> void registerObject(T& object) {
    auto sp = std::shared_ptr<T>(&object, [](T*){});
    std::shared_ptr<Object> op = std::static_pointer_cast<Object>(sp);
    objects_.push_back(op);
}

static_pointer_castカスタムの削除メソッドを新しいポインタに対して引き続き有効にするには、 で何が起こりますか?

ラムダが派生型を取ると評価しないので、私は尋ねますか? しかし、キャストされたポインターはObject*そのラムダに a を渡しますか? カスタム削除が呼び出されたときに「アップキャスト」が発生していませんか? 基本型が派生型であることを保証できないため、どれが不可能だと思いましたか?

4

1 に答える 1

3

a のboost::shared_ptr仕組みは次のとおりです。

  • (コード内の) 各インスタンスには、参照先の共有単一制御ブロックへのポインターがあります。

  • 少なくとも概念的には、このインスタンスによって暗示される型の、指示先への生のポインターも持っています。型により、この未加工のポインタは調整できますが、元のポインティ ポインタと同じビットパターンではありません。

  • 制御ブロックには、元の生のポインタ、参照カウント、および元の削除関数が含まれています。deleter func は、引数として元の生のポインティング ポインターを使用して呼び出されます (存在する場合)。

キャストすると、新しいshared_ptrインスタンスにのみ影響し、それが指す制御ブロックには影響しません。したがって、削除に必要な情報はまったく影響を受けません。インスタンスの (概念的な) 型指定されたポインティ ポインターは影響を受ける可能性がありますが。

于 2012-08-18T14:02:01.727 に答える