O
Ich kenn nur den auto_ptr und weiß jetzt nicht, wie ein smart-pointer das Problem hier lösen würde.
Man nimmt einen rohen Zeiger, wenn er nicht besitzen, sondern beobachten soll, und das automatische Kopieren und Zuweisen (aKuZ *abkürz*) ist korrekt.
Man nimmt einen auto_ptr, wenn der Objektinhalt verschoben werden soll, und das aKuZ tut das.
Man nimmt einen boost::scoped_ptr, wenn der Zeiger dem Objekt selbst gehört und unkopierbar ist, und das aKuZ gibt es gar nicht erst (korrekt).
Man nimmt einen boost::shared_ptr, wenn die Objekte dieser Klasse sich das angezeigerte Objekt teilen sollen, und das aKuZ ist korrekt.
Man nimmt einen selbstgeschrieben::copy_ptr (dessen operator= das angezeigerte Objekt des anderen Zeigers kopiert), wenn das angezeigerte Objekt jeder Objektinstanz selbst gehört, und das aKuZ ist korrekt.
...
Wenn man aber nicht die Klasse nimmt, die für den entsprechenden Zweck gebaut wurde, muss man sich selber jedes Mal drum kümmern (und hat jede Menge Möglichkeiten, Fehler einzubauen).
Sowas wie deine Buggy-Klasse kommt, meiner wenigen Erfahrung nach, nur sehr selten vor.
Das aKuZ manuell auszuhebeln lernt man irgendwann (und regt sich meistens darüber auf, dass C++ sowas Gemeines hinter dem Rücken des Programmierers veranstaltet), aber auch das wird hier im Forum schon oft genug unterschlagen. Und dass Klassen mehrere Resourcen verwenden kommt IMHO oft genug vor, ab da wird es ohne smart-ptr wirklich unschön...
Zumindest momentan, wo man sich entweder von boost o.ä. abhängig macht, oder wo jeder seinen eigenen Brei programmieren muss.
boost::scoped_ptr und boost::shared_ptr sind schon für den nächsten Standard vorgesehen. Boost zu verwenden ist also nichts sonderlich Exotisches Und sich die (bei mir) häufigsten zwei, boost::scoped_ptr und selbstgeschrieben::copy_ptr, selbst zu schreiben, dauert nicht lange - dafür kann man sich bei den restlichen Klassen dann zurücklehnen
(*predig*)