1

私はこのようなコードを防ぎたい:

unique_ptr<ClassA> captr = unique_ptr<ClassA>(new ClassA());
....
shared_ptr<Base> sptr = move(captr);

このコードはコンパイラエラーを生成するはずですが、代わりにコンパイルして、実行時にダブルフリーやその他の奇妙なエラーを生成します。shared_ptrにunique_ptrを割り当てることは、まったく意味がありません。何かがunique_ptrと宣言されている場合、それは共有されることを意図していません。ただし、shared_ptrへのunique_ptrの割り当てが許可されている場合、この制限はなくなります。

そして残念ながら、一部の関数がunique_ptrを返し、一部の関数がshared_ptrを引数として取る場合、非常に簡単に犯される間違いです。

質問は、テンプレート化されている特定のクラスに関係なく、unique_ptrとshared_ptrのすべてのテンプレート化されたバリエーションに対してこれらの割り当てを禁止するにはどうすればよいですか?

代入演算子を削除済みとして宣言するようなことを考えていますが、そのような宣言がどのようになるかはわかりません。

4

1 に答える 1

9
unique_ptr<ClassA> captr = unique_ptr<ClassA>(new ClassA());
....
shared_ptr<Base> sptr = move(captr);

これは確かに正しいコードです。ここで起こっていることは次のとおりです。

  1. unique_ptrリソースはinを介してキャプチャされcaptrます。
  2. リソースは後で 空にするために移動されshared_ptr sptrます。captr
  3. 現在、リソースは によって所有されていsptrます。
  4. のデストラクタはunique_ptr、そのリソースをもう所有していないため、そのリソースを破棄しません。

たぶん、これは単純化されたコードであり、カスタムのデリータを使用していて、のunique_ptr<ClassA>コンストラクタでそのデリータを使用していませんshared_ptrか? または、あなたのBaseクラスとDerivedクラスにリソース処理のバグが内部的にあるのではないでしょうか? もう 1 つのオプションは、これら 2 つのコードの間で何か間違ったことを行うことです。

于 2013-03-27T11:16:35.180 に答える