Richtige Speicherverwaltung für Placement New
Bei Verwendung von Placement New liegt es in der Verantwortung des Programmierers, den Destruktor manuell aufzurufen und den zugewiesenen Speicher freizugeben . Dies unterscheidet sich vom Standardverhalten des Löschoperators, der normalerweise beide Aufgaben übernimmt.
Warum nicht löschen?
Im bereitgestellten Code:
char* pMemory = new char[sizeof(MyClass)]; MyClass* pMyClass = new(pMemory) MyClass();
Speicher wird manuell mithilfe von new[] für ein Zeichenarray zugewiesen, dessen Größe dem MyClass-Objekt entspricht. Anschließend wird die Platzierung new verwendet, um das Objekt in diesem Speicher zu erstellen.
Die Verwendung von delete wäre hier falsch, da der Operator new[] verwendet wurde, um den Speicher manuell zuzuweisen. delete ist für Speicher gedacht, der mit dem Operator new zugewiesen wurde, was hier nicht der Fall ist.
Verantwortung des Destruktors
Da die Platzierung new verwendet wurde, liegt der Aufruf in der Verantwortung des Programmierers Der Destruktor gibt das Objekt frei. Dadurch wird der zugewiesene Speicher jedoch nicht automatisch freigegeben. Um einen Speicherverlust zu verhindern, sollte der Speicher explizit freigegeben werden, nachdem der Destruktor aufgerufen wurde.
Placement New mit internen Puffern
Placement new kann auch mit internen Puffern verwendet werden die nicht mit dem Operator new belegt wurden. In solchen Fällen sollte der Operator delete nicht aufgerufen werden, da dies zu unerwartetem Verhalten oder Speicherbeschädigung führen kann.
Zum Beispiel:
struct buffer_struct { std::aligned_storage_t<sizeof(MyClass), alignof(MyClass)> buffer; }; MyClass* pMyClass = new (&a.buffer) MyClass(); //created inside buffer_struct a
In diesem Fall stellt die buffer_struct den Speicher für die bereit MyClass-Objekt, aber die Objektkonstruktion und -zerstörung werden unabhängig voneinander mithilfe der Platzierung new bzw. des Destruktors gehandhabt.
Das obige ist der detaillierte Inhalt vonPlatzierung neu: Warum können wir „Löschen' nicht zum Freigeben von Speicher verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!