。それを行うには良い(まだ悪い)方法:
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!
変数に生ポインタを公開しないでください。これを行うことで、メンテナは簡単にRAWポインタを別の共有ポインタに入れることができます。 'my_ptr(new ClassA()); 'を使うだけです。メンテナはメンテナンスのために余分な作業をしなくてはなりません。 –
@Martin York私はちょうどそれについての点を含めるように編集していた。より明示的な注釈を追加します。しかし、あなたは正しいです。 :) – Dawson
'//またはshared_ptrの my_ptr = raw_ptr;';それは '//またはshared_ptrの my_ptrとして明示する必要がありますので、'(raw_ptr)、 'のstd :: shared_ptr'に間違っています。 –
Justme0