Klassenobjekt als Vektorelement, Destruktor wird zu oft aufgerufen

8
%Vor%

Ausgabe:

  

-Konstruktor: 1

     

Destruktor: 0

     

-Konstruktor: 1

     

Destruktor: 0

     

Destruktor: -1

     

aktueller Wert von k = -1

     

2

     

destruktor: -2

     

Destruktor: -3

Warum wurde der Destruktor zu oft aufgerufen, da er nur zweimal aufgerufen werden sollte, da der Konstruktor nur zweimal aufgerufen wird? Wie vermeide ich diese Situation?

    
user3798283 08.04.2016, 09:43
quelle

2 Antworten

4

Sie machen Kopien, aber Ihre Trace-Ausgabe zeigt das nicht an (und Ihr k wird nicht erhöht, wenn es passiert). Also gehen die "extra" Destruktoraufrufe mit Kopierkonstruktionen.

Sie können eine der Kopien entfernen, indem Sie emplace richtig verwenden:

%Vor%

aber Sie haben immer noch eine Kopie in push_back selbst.

Schreiben Sie einen Kopierkonstruktor, damit Ihre Trace-Ausgabe diese Operationen berücksichtigt:

%Vor%

(Ich würde mich nicht mit einem Move-Konstruktor herumärgern, als das wird delete den Copy-Assignment-Operator und alles Hölle wird sich lösen .)

Beendeter Code:

%Vor%

Ausgabe:

%Vor%

( Live-Demo )

    
quelle
3

Es wird ein vom Compiler generierter Kopierkonstruktor verwendet, der k nicht inkrementiert.

Fügen Sie das explizit in Ihren Quellcode ein, und alles wird gut.

    
Bathsheba 08.04.2016 09:56
quelle

Tags und Links