Hi Karsten 
wenn ich die STL richtig verstehe, ist der Pointer so
implementiert, das „niemals“ zwei auto_ptr auf den gleichen
Speicher zeigen dürfen. Sonst könnte der eine auto_ptr der aus
seinem Gültigkeitsbereich kommt den Speicher bereits löschen,
während mit dem anderen Pointer noch gearbeitet wird.
Stimmt, der Standard spricht da von einem „transfer of ownership“. In dem Moment, wo du ptr2=ptr1 schreibst, verliert ptr1 seine Macht über die Adresse und gibt sie an ptr2 ab. Nun sollte ptr1 nicht weiter benutzt werden. Daher wird er auf NULL gesetzt. Das ist das Verhalten, das der Standard vorschreibt. Aber es ist doch nicht das Verhalten, das du wirklich erwartest, oder? Es ist ein völliger Bruch mit dem Zuweisungsoperator in C++, wie ich schon in meinem vorigen Posting geschrieben habe.
Ich denke VC hat eine falsche implementierung.
Wenn du den puren Ansi-C+±Standard zu Grunde legst, dann ja. Wenn du aber die Denkweise eines Programmierers zu Grunde legst, dann hat Microsoft den auto_ptr nur extrem sinnvoll erweitert.
Microsoft führt nämlich einen Referenzzähler ein. Wenn du dann z.B. eine Anweisung wie ptr2=ptr1 schreibst, dann wird der Referenzzähler inkrementiert. Wenn nun ptr1 oder ptr2 zerstört werden (Destruktor), dann wird zunächst der Referenzzähler dekrementiert. Nur wenn dieser gleich 0 ist, wird auch der Speicherbereich, der hinter dem Pointer steckt gelöscht. Mit anderen Worten, ptr1 ist durch die Zuweisung nicht unbrauchbar geworden, sondern kann weiterhin benutzt werden. Daher muss er auch nicht mit dem Wert NULL belegt werden. Und genau das ist doch das Verhalten, das wir als Programmierer erwarten, oder?
Da du ptr1 nach dem Ansi-C+±Standard sowieso nicht mehr verwenden solltest, werden also alle Ansi-C++ konformen Sourcen mit dem Visual-C++ übersetzt. Wie üblich bietet Microsoft dem Programmierer ein wenig mehr, wodurch er allerdings Gefahr läuft, dass seine Programme nur noch mit Visual-C++ übersetzt werden können …
Viele Grüße
Stefan.