2009-07-20 6 views
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; } 
} 

これを行いブーストクラスがあれば、私はクラスを自分で書くのではなく、それを使用することを好むだろう。それはないと思われるか、間違っていますか?

+0

目的のポインタがpointeeの割り当てを解除するものではない場合は、その "スマート"な部分は何ですか?普通の古いポインタ(T *)が持っていないものから何を望みますか? –

+0

OPは両方に同じ静的型を必要とするため、コレクション内に所有インスタンスと所有外インスタンスを混在させることができます。 –

答えて

13

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

Using Custom Deallocator in boost::shared_ptr

は(あなただけの空の機能が欲しい。)

+0

しかしshared_ptrsを同じリスト内の異なる削除者と混在させることはできますか?彼らは異なったタイプになりますよね? –

+2

いいえ、deleterは 'shared_ptr'の型の一部ではありませんので、同じコレクション内の異なるDeleterを混在させることができます。 –

+0

@ mmutz:ありがとう、私はそれが今働く方法を見る! –

1

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

しかし、あなたは唯一のshared_ptrからのweak_ptrを作成することができますあなたのスタックに割り当てられたオブジェクトのために、私はそれがどのように動作するのか分かりません。

3

私はこのために私のツールボックスには、この小さなクラスを持っている:

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

使用法:

これは悪いデザインの匂い
int main() { 
    SomeClass sc; 
    boost::shared_ptr<SomeClass> p(&sc, nodelete()); 
    // ... 
} 
0

ポインタを削除したくないという妥当な状況は考えられません。ここに(不合理なIMOの)状況がある:

1)静的持続時間オブジェクト。代わりに、ローカルスタティックshared_ptr <>のコピーを返すinstance()メソッドを持つシングルトンをミックスするためにシングルトンミックスインを使用することを検討してください;ローカル統計はスレッドが安全ではないので、適切な静的mutexも必要です複数のスレッドによって呼び出される可能性があります)。適切なシングルトンを使用する利点は、shared_ptrを保持し続けている他のオブジェクトの後にシングルトンが破棄されることです。<>がそれです。

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

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

関連する問題