2011-01-12 26 views
29

私はオブジェクトへのポインタを持っています。どちらも所有権を持つ2つのコンテナに保管したいと思います。ですから、私はそれをC++ 0xのshared_ptrにするのが良いと思います。どのように私は生のポインタをshared_pointerに変換できますか?あなたは同じ生のポインタの両方のshared_ptrオブジェクトを初期化していない、またはそれが二度削除されますを確認する必要があり生ポインタからshared_ptrを作成

typedef unordered_map<string, shared_ptr<classA>>MAP1; 
MAP1 map1; 
classA* obj = new classA(); 
map1[ID] = how could I store obj in map1?? 

おかげ

答えて

28

。それを行うには良い(まだ悪い)方法:

classA* raw_ptr = new classA; 
shared_ptr<classA> my_ptr(raw_ptr); 

// or shared_ptr<classA> my_ptr = raw_ptr; 

// ... 

shared_ptr<classA> other_ptr(my_ptr); 
// or shared_ptr<classA> other_ptr = my_ptr; 
// WRONG: shared_ptr<classA> other_ptr(raw_ptr); 
// ALSO WRONG: shared_ptr<classA> other_ptr = raw_ptr; 

WARNING:上記のコード悪い習慣を示しています! raw_ptrは変数として存在してはいけません。スマートポインタを直接newの結果で初期化すると、間違って他のスマートポインタを誤って初期化する危険性を減らすことができます。あなたがすべきことは次の通りです。

shared_ptr<classA> my_ptr(new classA); 

shared_ptr<classA> other_ptr(my_ptr); 

コードはより簡潔です。

EDIT

私はおそらくそれがマップでどのように動作するかについて詳しく説明すべきです。未加工のポインタと2つのマップがある場合は、上に示したものと同様のことができます。

unordered_map<string, shared_ptr<classA> > my_map; 
unordered_map<string, shared_ptr<classA> > that_guys_map; 

shared_ptr<classA> my_ptr(new classA); 

my_map.insert(make_pair("oi", my_ptr)); 
that_guys_map.insert(make_pair("oi", my_ptr)); 
// or my_map["oi"].reset(my_ptr); 
// or my_map["oi"] = my_ptr; 
// so many choices! 
+2

変数に生ポインタを公開しないでください。これを行うことで、メンテナは簡単にRAWポインタを別の共有ポインタに入れることができます。 'my_ptr(new ClassA()); 'を使うだけです。メンテナはメンテナンスのために余分な作業をしなくてはなりません。 –

+0

@Martin York私はちょうどそれについての点を含めるように編集していた。より明示的な注釈を追加します。しかし、あなたは正しいです。 :) – Dawson

+0

'//またはshared_ptrの my_ptr = raw_ptr;';それは '//またはshared_ptrの my_ptrとして明示する必要がありますので、'(raw_ptr)、 'のstd :: shared_ptr'に間違っています。 – Justme0

3

あなたはさまざまな方法を使用しますが、リセットすることができます()が良いでしょう:

map1[ID].reset(obj); 

そして、二つのマップが同じshared_ptrの参照持つの問題に対処するために、我々は持つことができます

map2[ID] = map1[ID]; 

二重削除を避けるための一般的なトリックは、生のポインタをまったく避けることです。 したがって避ける:

classA* obj = new classA(); 
map1[ID].reset(obj); 

を代わりにストレートのshared_ptrに新しいヒープオブジェクトを置きます。

+0

それはそれ自体悪い習慣ではありません、それはc-practiceです! – g24l

関連する問題