38

scoped_ptrはコピーできず、スコープ外で削除されています。だからそれは一種の制限されていshared_ptrます。したがって、本当にコピー操作を制限する必要がある場合以外に、shared_ptr使用する方がよいようです。オブジェクトのコピーを作成する必要があるかどうかわからない場合があるためです。したがって、問題は次のとおりです。上記の場合に加えて、のshared_ptr代わりに使用する方が良い(または推奨される)と考えられますかscoped_ptrscoped_ptrからはるかに高速に動作しますかshared_ptr、それとも何か利点がありますか?

ありがとう!

4

5 に答える 5

72

shared_ptrよりも重量級ですscoped_ptr。管理対象オブジェクトだけでなく、参照カウント オブジェクトを割り当てて解放し、スレッドセーフな参照カウントを処理する必要があります。私が作業したあるプラットフォームでは、これはかなりのオーバーヘッドでした。

私のアドバイス (一般的に) は、ニーズを満たす最も単純なオブジェクトを使用することです。参照カウント共有が必要な場合は、shared_ptr;を使用します。単一の参照を終了した後に自動削除が必要な場合は、 を使用しますscoped_ptr

于 2009-11-20T14:14:42.420 に答える
16

パフォーマンス-shared_ptrより多くの機能を備えていますが、追加の割り当ても必要です (これも大きくなりますが、ほとんど問題になりません)。

[編集] を使用することで 2 番目の割り当てを回避できますがmake_sharedweak_ptrオブジェクトが破棄された後でも全体の割り当てが保持されるため、大きなオブジェクトでは問題になる可能性があります。

あなたを使用した意図の表現は、scoped_ptrあなたがしたいことをより明確に述べます。(疑問に思った場合-それは良いことです:))。これを正しく行うと、shared_ptr は「このオブジェクトはこのスコープを超えて存続することを意図しています」とも示します。

于 2009-11-20T14:20:40.030 に答える
6

それらの意図された目的は異なるので、多くの場合、「shared_ptrとscoped_ptr」はまったく問題ではありません。もちろん、必要なのがscoped_ptrだけの場合は、shared_ptrを使用できます。しかし、ポイントは何ですか?shared_ptrは、すべての参照カウントが関係しているため、オーバーヘッドがわずかに大きくなる可能性があります。

于 2009-11-20T14:10:20.987 に答える
3

scoped_ptrからはるかに高速に動作しshared_ptrます。それはそうです。shared_ptr常にアロケータまたはデフォルトのアロケータを使用してメモリを割り当てます。

于 2009-11-20T14:09:38.980 に答える
1

Scoped_ptr は、shared_ptr、weak_ptr、または unique_ptr とほとんど共通点がありません。これは、「参照カウント」の非常に特殊なケースのみを実行しているためです。これは、適切に設計されたコードで頻繁に必要になるものではありませんが、利用できる優れたツールです。

基本的に、scoped_ptr は参照カウントされるものではありません。むしろ、これはスタック上 (ローカル スコープ内) に作成するオブジェクトなので、次のようなことができます。

  //Some enclosing scope- anything set off by "{}" or even a function:
   {
       scoped_ptr<MyObject> ptr = new MyObject( parameters...);
   } // When we hit this closing brace, "ptr" will delete the "MyObject" inside.

このパターンは、ミューテックスやその他の同期プリミティブでよく見られます。渡されたミューテックスをロックする「AutoLock」を宣言し、削除時にロックを解除して「{}」スコープ全体をクリティカル セクションにすることができます。

また、「scoped_ptr」は、何らかの理由で「MyObject obj(params..)」のような単純な古いスタック割り当てを実行できない場合にのみ意味があることに注意してください。結局のところ、ヒープに割り当てられたオブジェクトをスタック上のオブジェクトであるかのように使用できるようにするためです。これは、shared_ptr とその従兄弟の参照カウントよりもはるかにまれな使用例になる傾向があります。

于 2014-08-01T21:29:44.350 に答える