Heim >Backend-Entwicklung >C++ >Wie kann ich mit Placement New in C zugewiesenen Speicher ordnungsgemäß freigeben?

Wie kann ich mit Placement New in C zugewiesenen Speicher ordnungsgemäß freigeben?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-30 18:24:03741Durchsuche

How to Properly Deallocate Memory Allocated with Placement New in C  ?

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!

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