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%Es gibt zwei Dinge, die Ihrer Aufmerksamkeit entgangen sind:
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.
Tags und Links c++ c++11 vector move-semantics