Heim > Backend-Entwicklung > C++ > Hauptteil

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

Mary-Kate Olsen
Freigeben: 2024-10-30 18:24:03
Original
680 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!