2016-05-13 11 views
-2

Warum, wenn ich einen Code wie diesen schreiben (X ist eine generische Klasse) Aufruf und DestruktorDoppel free() oder Korruption: C++

int main() 
     { 
     X one(); 
     one.~X(); 
     return 0; 
     } 

geben Sie mir diesen Fehler?

Double free() or corruption:C++ 
+0

Sie müssen die Destruktoren nicht manuell so aufrufen. Lokale Objekte werden automatisch am Ende des Bereichs gelöscht: '{Y background (3000, 5000); } 'löscht das Objekt am'} '. – kfsone

+0

_ @ Tarlo_x_ Stoppen Sie herumhüpfen mit rohen Zeigern. Verwenden Sie stattdessen Standardcontainer. –

+2

Und wenn der Lehrer verlangt, dass Sie russisches Roulette mit einer automatischen Pistole spielen? Obwohl ich hinzufügen sollte, sind die Einsätze etwas niedriger mit Zeigern. – user4581301

Antwort

4

Sie sollten fast Destruktoren nie explizit aufrufen, werden sie implizit aufgerufen, wenn ein Objekt außerhalb des Bereichs fällt (oder delete d, zugeordnet, wenn auf Heap). Zuerst geben Sie das Array background manuell frei, indem Sie background.~Y() aufrufen, und als nächstes versucht das gleiche Array, beim nächsten } erneut die Zuordnung aufzuheben.

1

Der Aufruf des Destruktors eines Objekts ist fast immer falsch. Tatsächlich bin ich nie auf eine Situation gestoßen, in der das richtig war. Sie müssen sich über RAII und vielleicht diesem Beispiel lesen, wird Ihnen helfen, zu verstehen, warum Sie den Fehler:

#include <iostream> 

struct Foo{ 
    Foo() { std::cout << " constructor " << std::endl; } 
    ~Foo() { std::cout << " destructor " << std::endl; } 
}; 

int main(){ 
    Foo foo; 
    // foo.~Foo(); // <- never ever do this ! 
}     // <- object is destroyed here ! 

Führen Sie dieses und Sie werden sehen, dass die destructor bereits genannt wird. Das Zerstören eines bereits zerstörten Objekts führt zu dem Fehler, den Sie bekommen.