2

コンテナーに共有ポインターと生のポインターを同時に設定する必要があります。

no-op deleter と no-op (de)allocator で構築された場合、 のshared_ptr<T>ように動作することを余儀なくされる可能性があると思いますか?T*

それとも、さまざまな (スマートおよび生の) ポインター型にバインドするユニバーサル スマート ポインターがあるのでしょうか?

またはshared_ptr、あるオブジェクトを指すことができますが、同じタイプの別の (nullptr) オブジェクトの有効期間を管理できますか?

バックグラウンド。私は単純なコンポーネントシステムを持っています。一部のコンポーネントは組み込みで、管理は不要です。生のポインターで十分です。他のコンポーネントは外部 DLL であり、要求されたときにアタッチされ、「セッション」から削除されたときにデタッチされる必要があります。後者については、破棄時に DLL をデタッチするラッパー コンポーネントを使用しています。

編集:背景が更新されました。
EDIT2:質問が更新されました。
EDIT3:まっすぐな解決策が見つかりました。興味があれば私の答えを見てください。

4

3 に答える 3

2

まあ、それはあなたのニーズが何であるか、より具体的には所有権に関して何を達成したいかによって異なります。

  1. あなたがvector所有する必要がありますshared_ptr<T>か?(または、ポインティを保管できますか?)
  2. あなたがvector所有する必要がありますT*か?

それからさまざまな解決策があります。

  1. 完全な所有権:T*を通常のshared_ptr<T>
  2. 部分的な所有権:shared_ptr<T>前述のように、ノーオペレーションのデリータでインスタンス化して、T*
  3. shared_ptr<T>所有権なし:使用中.get()の唯一のストアをアンラップするだけですT*
于 2013-04-26T15:21:52.453 に答える
2

一般的に言えば、いいえ。コンテナーには、1 つのタイプのオブジェクトのみが含まれます。

boost::variant<shared_ptr<T>, T*>含まれるオブジェクトとして、ある種のオブジェクトを使用できます。ただし、その要素にアクセスするには訪問者が必要です。または、boost::shared_ptr指定された値を実際には削除しない特別な削除オブジェクトを指定することもできます。

于 2013-04-26T15:15:24.833 に答える
1

共有ポインタは 1 つのオブジェクトを指すことができますが、別のオブジェクトの有効期間を管理します。不思議なことに、それは何も管理しないかもしれませんが、それでも何かを指しています。共有するオブジェクトを決定するために使用される、別の共有ポインターを受け入れる特別なコンストラクターがあります。空の共有ポインタを渡すことができます。

template <typename T>
std::shared_ptr<T> fake_shared(T *ptr)
{
    std::shared_ptr<T> dummy (nullptr); // we have nothing to manage;
    std::shared_ptr<T> faked (dummy, ptr); // but we have something to point to;
    return faked;
}

さらに、2 つの事実を利用できます。まず、このコンストラクターは、任意の (その他の) 型の共有ポインターを受け入れます。第二に、std::shared_ptr<void>合法であり、私たちの意図をより明確に表現するために使用される可能性があります.

template <typename T>
std::shared_ptr<T> fake_shared(T *ptr)
{
    std::shared_ptr<void> dummy (nullptr); // we have really nothing to manage;
    std::shared_ptr<T> faked (dummy, ptr); // but we have something to point to;
    return faked;
}

別の方法として、カスタム デリーターを受け入れるコンストラクターを使用し、no-op デリーターをそれに渡すこともできます。

template <typename T>
std::shared_ptr<T> fake_shared(T *ptr)
{
    std::shared_ptr<T> faked (ptr, [](T *){}); // won't be deleted;
    return faked;
}

EDIT : リビジョン、共有 void、カスタム デリータ。

于 2013-04-26T16:03:38.993 に答える