私はしばしばshared_ptrを使用します。
Shared_ptrは値によってコピーされるため、ポインタ値と参照カウントの両方をコピーするコストがかかりますが、boost :: intrusive_ptrを使用すると参照カウントをクラスに追加する必要があります未処理のポインタを使用する場合に比べてオーバーヘッドはありません。
私の経験では、99%以上の時間で、コード全体にboost :: shared_ptrインスタンスをコピーするオーバーヘッドは重要ではありません。 C. A. R. Hoareが指摘するように、早すぎる最適化は無意味です。ほとんどの場合、他のコードは小さなオブジェクトをコピーする時間よりもかなり長い時間を使用します。あなたのマイレージは異なる場合があります。プロファイリングでコピーが問題であることが示されている場合は、侵入型のポインタに切り替えることができます。
前述のとおり、weak_ptrを使用してサイクルを分割する必要があります。そうしないとメモリリークが発生します。これはグラフなどのデータ構造で発生しますが、たとえば、リーフが後方を向くことのないツリー構造を作成している場合は、ツリーのノードに対してshared_pointersを問題なく使用できます。
shared_ptrを使用すると、コードが大幅に簡素化され、読みやすく、保守が容易になります。多くの場合、それらを使用するのが正しい選択です。
もちろん、すでに述べたように、場合によってはscoped_ptr(またはscoped_array)を使用するのが適切です。 pointeeが共有されていない場合は、共有ポインタを使用しないでください。
最後に、最近のC++標準ではstd :: tr1 :: shared_ptrテンプレートが提供されています。これは現在ほとんどのプラットフォーム上にありますが、tr1用の侵入型ポインタ型はないと思います私はそれを自分で聞いたことがありません)。
文字列は通常COWを使用しません。マルチスレッドのアプリケーションではうまく動かないため、ほとんどの実装で再びその問題が解決されました。つまり、文字列のコピーには多少のコストがかかります。 – jalf
GCCの文字列実装ではまだCOW IIRCが使用されています。しかし、C++ 0xの場合、これらはおそらく許可されません(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2668.htm)。 –