2010-03-27 4 views
8
std::string x(x); 

Dies stürzt sehr schlecht auf meinem Compiler. Bedeutet das, dass ich in meinen eigenen Kopierkonstruktoren für this != &that prüfen sollte, oder kann ich annehmen, dass kein Klient jemals so dumm sein wird?Std :: Zeichenfolge x (x);

+0

Meinen Sie das resultierende Programm abstürzt, oder der Compiler stürzt ab? –

+0

In einem Kopierkonstruktor, der nicht benötigt wird, aber Sie sollten das in einem Zuweisungsoperator überprüfen. –

+1

Das resultierende Programm stürzt zur Laufzeit ab. – fredoverflow

Antwort

6

Etwas mit sich selbst zu initialisieren ist ein undefiniertes Verhalten, was wahrscheinlich sogar bedeuten kann, dass es nach dem Aufruf sogar nicht mehr erkannt werden kann. Angenommen, der Compiler erkennt es und erzeugt aus Trotz eine Assembly für nasale Dämonen, keinen Aufruf an Ihren Kopierkonstruktor?

In der Praxis können Sie davon ausgehen, dass der Client nicht so dumm ist, und wenn sie es sind, ist es ihr Geschäft, es zu debuggen und es herauszufinden.

+1

Woher genau sagt der Standard, dass dies ein undefiniertes Verhalten ist? – fredoverflow

+1

Ehrlich gesagt bin ich überrascht, dass es sogar kompiliert. Das Problem ist, 'std :: string's Kopierkonstruktor wird versuchen, Methoden/Zugriffsdaten in' x' aufzurufen, aber 'x' wurde noch nicht konstruiert. Daher ist es undefiniertes Verhalten, weil es versuchen würde, Dinge mit einer Variablen zu tun, die noch nicht konstruiert wurde. –

+0

@FredOverflow: Ich denke, ein Teil des Standards, der relevant ist, ist der "Punkt der Deklaration" (3.3.1). Es ist auch möglich, dass dies einige sinnvolle Verwendungen hat, z. B. angenommen, dass die Klasse einen Verweis auf eine andere Instanz der Klasse (oder selbst) speichert, dann könnten wir beispielsweise tun: X X ("self", x); X y ("other", x); usw. In einem solchen Fall würde ich annehmen, dass die Regeln ähnlich sind wie die Verwendung von ** this ** in einer Klasseninitialisierungsliste. – UncleBens

9

Sie sollten nicht gegen Code testen, der schlecht abstürzt. Siehe Null References. Es heißt

"So wie Sie annehmen müssen, dass ein Nicht-Null-Zeiger gültig ist, müssen Sie davon ausgehen, dass eine Referenz gültig ist. Sie müssen Vertrauen in Ihre Kollegen Programmierer haben."

Ich möchte

ergänzen ... Sie müssen davon ausgehen, dass die Quelle einer Kopie gültig ist.

Wenn Sie Ihren Fall "reparieren", was für diesen zu tun?

string x = string(x); 
2

Dieser Code ist nicht korrekt nach der Norm und es macht keinen Sinn, es zu überprüfen machen und das Beste, was so ist ein schnelles Versagen, dass der Benutzer seinen Code korrigieren kann passieren kann.