2017-08-25 3 views
3

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.

+11

'C1 f1 (C1 x) {}' hat ein undefiniertes Verhalten, weil es keinen Wert zurückgibt. – AndyG

+0

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. –

Antwort

12

Aktivieren Sie Ihre Warnungen:

Warnung: keine return-Anweisung in der Funktion nicht-void [-Wreturn-type] Rückkehr

Sie undefined behavior in Ihrem Programm haben, was bedeutet, dass alles passieren kann . Der Compiler gibt wahrscheinlich "eine undefinierte Instanz von C1 hier zurück", wodurch der Destruktor aufgerufen wird.

Das Programm möglicherweise abstürzen oder tun alles andere abhängig von Ihrem Compiler/Flags/Maschine.

9

Ändern C1 f1(C1 x){} zurückzukehren tatsächlich etwas und Ihr Ausgang wird wie erwartet (Demo)

C1 f1(C1 x){ return {};} 

KONSTR WAS HERE
COPY KONSTR WAS HERE
KONSTR WAS HERE
DESTR WAS HERE
DESTR WAR HIER
DESTR WAR HIER

Andernfalls weist Ihr Code ein undefiniertes Verhalten auf.

Verwandte Themen