Warum ruft emplace_back den Destruktor auf?

8

Ich habe eine Klasse mit gelöschter Kopie ctor und einem Destruktor, der eine C-Ressource freigibt.

Ich würde erwarten, dass emplace_back Objekte verschiebt und den Destruktor nur einmal aufruft, aber er wird in emplace_back aufgerufen, wie in der stl-Implementierung unter Linux unten zu sehen ist. Warum passiert das?

Das Ergebnis ist, dass die C-Ressource mehr als einmal freigegeben wird.

%Vor%     
piotr 08.02.2014, 13:05
quelle

1 Antwort

4

Es gibt zwei Dinge, die Ihrer Aufmerksamkeit entgangen sind:

  1. Ein verschobenes Objekt wird immer noch zerstört, daher muss Ihre Verschiebeoperation Ressourcen
  2. übertragen
  3. Wenn ein vector wächst, muss es möglicherweise neu zugewiesen werden was eine 4-Schritte-Operation ist: Neuen Speicher abrufen, neue Elemente im neuen Speicher verschieben (oder kopieren) (aus dem alten), alte Elemente zerstören, alten Speicher freigeben.

Ihr Problem besteht einfach darin, dass Sie Ressourcen nicht richtig übertragen; Verwenden Sie std::unique_ptr als Basis für Ihre benutzerdefinierte Klasse und Sie werden solche Leiden nicht leiden.

    
Matthieu M. 08.02.2014, 14:05
quelle

Tags und Links