2016-04-04 8 views
2

mit las ich here dassAlternative für diese löschen, wenn die Platzierung neuer

Solange Sie vorsichtig sind, ist es in Ordnung ist (nicht böse) für ein Objekt zu Selbstmord zu begehen (delete this).

Hier ist, wie ich „vorsichtig“ zu definieren:

Sie müssen absolut 100% positiv sicher sein, dass dieses Objekt über neue zugewiesen wurde (nicht durch neue [], noch durch die Platzierung neuer, noch ein lokales Objekt auf der Stack, noch ein Namespace-scope/global, noch ein Mitglied eines anderen Objekts; aber durch einfaches neues).

Wenn ich Placement neu verwende, welche Alternativen habe ich?

+6

Nicht sicher, was Sie meinen. Wenn Sie placement new verwenden, können Sie 'delete this' nicht aufrufen. In der Tat sind Gründe für den Aufruf "löschen", obwohl sie existieren, selten. Bist du sicher, dass du eins hast? Sehen wir nicht ein XY-Problem? – SergeyA

+1

http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – RhinoDevel

+2

@SergeyA: Referenz erforderlich. Ich glaube, dass es in diesem Bereich tatsächlich einen Standarddefekt gibt, weil die derzeitige Formulierung dies zulässt. "Der Wert des Operanden delete kann ein Nullzeigerwert sein, ein Zeiger auf ein Nicht-Array-Objekt, das durch einen vorherigen neuen Ausdruck erzeugt wurde, oder ein Zeiger auf ein Unterobjekt (1.8), das eine Basisklasse eines solchen Objekts darstellt". Placement new erstellt ein Objekt, obwohl es nicht zugeordnet wird. Siehe dazu http://stackoverflow.com/q/4418220/103167 –

Antwort

3

Platzierung neu auf separate Speicherzuordnung und Objektlebensdauer verwendet, so dass Du würdest den destructor in der Regel ruft ausdrücklich:

myobj->~myclass(); 

und frei, die Speicher höher oder weiter den Speicher für andere Zwecke verwenden.

0

Platzierung neu bedeutet, dass das Objekt nicht auf dem Heap zugeordnet ist, aber Speicher für seinen Speicher vom Benutzer bereitgestellt wird. Löschen in diesem Fall versuchen würde, einen nicht-Heap-Blöcke freizugeben, die in der Regel tödlich ...

Es gibt nichts zu löschen, so müssen Sie eine explizite Destruktoraufrufs tun:

struct SomeClass { 
    SomeClass() { std::cout << "Constuctor\n"; } 
    ~SomeClass() { std::cout << "Destructor\n"; } 
}; 

std::aligned_storage<sizeof(SomeClass), alignof(SomeClass)>::type storage; 
new(&storage) SomeClass(); 
reinterpret_cast< SomeClass* >(&storage) -> ~SomeClass(); 

Mit einem this Pointer ist nicht genug, um in einem allgemeinen Fall die richtige Zerstörung zu bewirken.

0

Seit der Ankunft von std::shared_ptr und std::unique_ptr ist es nicht notwendig (und unerwünscht) Objekte zu schreiben, die ihre eigenen Lebensdauern verwalten.

Gutes C++ Formular erfordert, dass ein Objekt eine Verantwortlichkeit hat. Die Verantwortung Ihres Objekts ist die Arbeit, die es ausführt. Die Verantwortung eines intelligenten Zeigers besteht darin, seine Lebensdauer zu verwalten.

Es gibt noch ein Szenario, in dem Sie delete this benötigen - wenn Sie ein Objekt für eine alte API schreiben, die eine intrusive Referenzzählung erfordert.