Ich benutze shared_ptr oft.
Da Shared_ptr by-value kopiert werden, können Sie die Kosten für das Kopieren des Pointer-Werts und eines Referenzzählers übernehmen, aber wenn boost :: intrusive_ptr verwendet wird, muss die Referenzanzahl zu Ihrer Klasse hinzugefügt werden kein zusätzlicher Overhead über dem eines rohen Pointers.
Nach meiner Erfahrung, mehr als 99% der Zeit, ist der Overhead des Kopierens boost :: shared_ptr Instanzen in Ihrem Code unbedeutend. Gewöhnlich, wie C. A. R. Hoare bemerkte, ist eine vorzeitige Optimierung sinnlos - die meiste Zeit wird anderer Code wesentlich mehr Zeit benötigen als die Zeit, um kleine Objekte zu kopieren. Ihre Laufleistung kann variieren. Wenn beim Profiling angezeigt wird, dass das Kopieren ein Problem darstellt, können Sie zu störenden Zeigern wechseln.
Wie bereits oben erwähnt, müssen Zyklen durch Verwendung eines weak_ptr unterbrochen werden, oder es tritt ein Speicherleck auf. Dies wird bei Datenstrukturen wie z. B. einigen Graphen passieren. Wenn Sie jedoch beispielsweise eine Baumstruktur erstellen, bei der die Blätter niemals nach hinten zeigen, können Sie einfach shared_pointers für Knoten des Baums ohne Probleme verwenden.
Die Verwendung von shared_ptr vereinfacht den Code erheblich, erleichtert das Lesen und vereinfacht die Pflege. In vielen Fällen ist die richtige Wahl die richtige Wahl.
Wie bereits erwähnt, ist die Verwendung von scoped_ptr (oder scoped_array) in einigen Fällen die richtige Wahl. Wenn der Pointe nicht freigegeben wird, verwenden Sie keine geteilten Pointer!
Schließlich bietet der neueste C++ - Standard die std :: tr1 :: shared_ptr Vorlage, die jetzt auf den meisten Plattformen ist, obwohl ich glaube nicht, dass es einen intrusiven Zeigertyp für tr1 gibt (oder besser, es könnte sein , aber ich habe selbst nichts davon gehört).
Zeichenfolgen verwenden normalerweise nicht COW. Es funktioniert nicht gut mit Multithread-Anwendungen, daher haben die meisten Implementierungen es wieder fallengelassen. Was bedeutet, dass Zeichenkettenkopien etwas teuer sind. – jalf
Die String-Implementierung von GCC verwendet immer noch COW IIRC. Aber mit C++ 0x werden sie * wahrscheinlich * nicht erlaubt sein (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2668.htm) - und gute Riddance. –