Heim  >  Artikel  >  Backend-Entwicklung  >  Platzierung neu: Warum können wir „Löschen“ nicht zum Freigeben von Speicher verwenden?

Platzierung neu: Warum können wir „Löschen“ nicht zum Freigeben von Speicher verwenden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-26 13:50:02367Durchsuche

 Placement New: Why Can't We Use `delete` to Deallocate Memory?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn