Alle Antworten beschreiben bestimmte Fälle, aber es gibt eine allgemeine Antwort:
Sie rufen den dtor jedes Mal explizit auf, wenn Sie das Objekt nur zerstören müssen (im C ++ - Sinne), ohne den Speicher freizugeben, in dem sich das Objekt befindet.
Dies geschieht normalerweise in allen Situationen, in denen die Speicherzuweisung / -freigabe unabhängig von der Objektkonstruktion / -zerstörung verwaltet wird. In diesen Fällen erfolgt die Konstruktion durch Platzierung neu auf einem vorhandenen Speicherblock, und die Zerstörung erfolgt durch expliziten dtor-Aufruf.
Hier ist das rohe Beispiel:
{
char buffer[sizeof(MyClass)];
{
MyClass* p = new(buffer)MyClass;
p->dosomething();
p->~MyClass();
}
{
MyClass* p = new(buffer)MyClass;
p->dosomething();
p->~MyClass();
}
}
Ein weiteres bemerkenswertes Beispiel ist die Standardeinstellung std::allocator
bei Verwendung durch std::vector
: Elemente werden vector
während erstellt push_back
, aber der Speicher wird in Blöcken zugewiesen, sodass die Elementkonstruktion bereits vorhanden ist. Und daher vector::erase
müssen die Elemente zerstört werden, aber nicht unbedingt wird der Speicher freigegeben (insbesondere, wenn bald ein neuer push_back erfolgen muss ...).
Es ist "schlechtes Design" im strengen OOP-Sinne (Sie sollten Objekte verwalten, nicht Speicher: Die Tatsache, dass Objekte Speicher benötigen, ist ein "Vorfall"), es ist "gutes Design" in "Low-Level-Programmierung" oder in Fällen, in denen Speicher vorhanden ist Nicht aus dem "Free Store" entnommen, operator new
kauft der Standard ein.
Es ist schlechtes Design, wenn es zufällig um den Code herum passiert, es ist gutes Design, wenn es lokal für Klassen passiert, die speziell für diesen Zweck entwickelt wurden.