4

スマートポインターのリストがあります。これらのスマート ポインターの一部を通常のポインターとして機能させたいと考えています。つまり、それらは単にインスタンスへの参照であり、その解放には関与しません。たとえば、スタックに割り当てられたインスタンスを指す場合があります。リスト内の他のスマート ポインターは、通常の boost::shared_ptr として機能する必要があります。

クラスは次のようになります。

template<class T> smart_ptr {
private:
    T *p;
    boost::shared_ptr<T> sp;
public:
    smart_ptr(T *p): p(p), shared(0) { } // p will not be deleted
    smart_ptr(boost::shared_ptr<T> &sp): p(sp.get()), sp(sp) { }
    T *get() const { return p; }
}

これを行うブースト クラスがある場合は、自分でクラスを作成する代わりにそれを使用することをお勧めします。何もないように見えますが、間違っていますか?

4

4 に答える 4

13

コンストラクタの 1 つshared_ptrはデストラクタ メソッドを取り、空のファンクタを渡すことができます。

boost::shared_ptr でのカスタム ディアロケーターの使用

(空の関数だけが必要です。)

于 2009-07-20T09:09:47.423 に答える
3

このために、ツールボックスにこの小さなクラスがあります。

struct nodelete {
    template <typename T>
    void operator()( T * ) {}
};

使用法:

int main() {
    SomeClass sc;
    boost::shared_ptr<SomeClass> p( &sc, nodelete() );
    // ...
}
于 2009-07-20T09:20:38.867 に答える
1

これはブーストのように聞こえます::weak_ptr: http://www.boost.org/doc/libs/1_35_0/libs/smart_ptr/weak_ptr.htm

ただし、shared_ptr からは weak_ptr しか作成できないため、スタック割り当てオブジェクトについては、それがどのように機能するかわかりません。

于 2009-07-20T09:11:03.100 に答える
0

これは悪いデザインのにおいがします。

ポインタを削除したくないという合理的な状況は考えられません。(不合理なIMO)状況は次のとおりです。

1)静的期間オブジェクト。代わりに、シングルトンミックスインの使用を検討してください(CRTPを使用して、ローカル静的shared_ptr <>のコピーを返すinstance()メソッドを持つシングルトンをミックスインします。ローカル静的はスレッドセーフではないため、これには適切な静的ミューテックスも必要です。複数のスレッドから呼び出すことができます)。適切なシングルトンを使用する利点は、shared_ptr <>を保持し続ける他のオブジェクトの後に、終了時にシングルトンが破棄されることです。

2)スタック上に作成されたオブジェクト。これをしないでください。代わりに、shared_ptr<>で保護されたヒープ上にオブジェクトを作成します。コードのさまざまな部分でオブジェクトにshared_ptr<>を作成する必要がある場合(つまり、元のshared_ptr <>からコピーを取得できない場合)、boost :: enable_shared_from_this <>から継承し、shared_ptr<>を取得します。 shared_from_this()から。

何も削除しないshared_ptr<>が必要な他の理由はありますか?

于 2010-03-11T15:37:19.327 に答える