das folgende Stück Code vor:C++ - Destructor wird mehrmals aufgerufen als erwartet
class C1
{ public:
C1(){ cout<<"CONSTR WAS HERE"<<endl; }
C1(const C1&ob){ cout<<"COPY CONSTR WAS HERE"<<endl; }
~C1(){ cout<<"DESTR WAS HERE"<<endl; }
}
void f1(C1 x){ }
int main()
{
C1 c1;
f1(c1);
}
Wenn wir den Code ausführen, wie es ist, erhalten wir:
CONSTR WAS HERE
COPY CONSTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
die sich von durchaus verständlich ist aus meiner Sicht. Wenn wir jedoch die Funktion "f1" ändern:
C1 f1 (C1 x) {}
anstelle von
Hohlraum f1 (C1 x) {}
erhalten wir:
CONSTR WAS HERE
COPY CONSTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
DESTR WAS HERE
und ich bin mir nicht ganz sicher warum.
'C1 f1 (C1 x) {}' hat ein undefiniertes Verhalten, weil es keinen Wert zurückgibt. – AndyG
Wenn Sie eine Funktion deklarieren, um etwas zurückzugeben (dh der Rückgabetyp ist etwas anderes als "void"), muss die Funktion * * etwas zurückgeben, oder Sie haben [* undefiniertes Verhalten *] (http: //en.cppreference. com/w/cpp/language/ub) (was Ihr Programm schlecht formatiert und ungültig macht). Spekulieren über jede Art von Verhalten in einem Programm mit UB ist ein strittiger Punkt. –