Heim > Artikel > Backend-Entwicklung > Wie kann ich mit Placement New in C zugewiesenen Speicher ordnungsgemäß freigeben?
Platzierungs-Neu- und Lösch-Rätsel
In C entsteht beim Zuweisen von Speicher mit dem Platzierungs-Neu-Operator ein Dilemma hinsichtlich der geeigneten Methode zum Aufheben der Zuordnung diese Erinnerung. Lassen Sie uns zwei mögliche Lösungen untersuchen:
Lösung 1:
<code class="c++">const char* charString = "Hello, World"; void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1); Buffer* buf = new(mem) Buffer(strlen(charString)); delete (char*)buf;</code>
Diese Lösung versucht, den zugewiesenen Speicher als Zeichenzeiger zu löschen. Dieser Ansatz ist jedoch falsch, da er den Destruktor des Objekts nicht ordnungsgemäß verarbeitet oder den Rohspeicher nicht freigibt.
Lösung 2:
<code class="c++">const char* charString = "Hello, World"; void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1); Buffer* buf = new(mem) Buffer(strlen(charString)); delete buf;</code>
Diese Lösung versucht dies ebenfalls löscht den zugewiesenen Speicher, ruft jedoch direkt den Löschoperator für den Buffer*-Zeiger auf. Dies würde funktionieren, wenn der Speicher mit dem regulären neuen Operator zugewiesen würde. Da jedoch „Placement New“ verwendet wurde, ist auch dieser Ansatz falsch.
Richtige Lösung:
Die richtige Methode zum Freigeben des zugewiesenen Speichers ist:
<code class="c++">buf->~Buffer(); ::operator delete(mem);</code>
Diese Lösung ruft explizit den Destruktor für das Buffer-Objekt (buf->~Buffer()) auf und gibt dann den Rohspeicher mithilfe der Operator-Löschfunktion (::operator delete(mem)) frei.
Der entscheidende Unterschied besteht darin, dass bei Verwendung von „Placement New“ die Löschfunktion des Operators direkt aufgerufen werden muss, um den Rohspeicher freizugeben. Der Versuch, den vom Platzierungs-Neu-Operator erhaltenen Zeiger zu löschen, wird den Destruktor nicht ordnungsgemäß aufrufen oder den Speicher nicht vollständig freigeben.
Das obige ist der detaillierte Inhalt vonWie kann ich mit Placement New in C zugewiesenen Speicher ordnungsgemäß freigeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!