Heim > Backend-Entwicklung > C++ > Hauptteil

Wie kann man mit „placement new' in C zugewiesenen Speicher ordnungsgemäß freigeben?

DDD
Freigeben: 2024-10-30 12:50:02
Original
576 Leute haben es durchsucht

 How to Properly Deallocate Memory Allocated with

Richtige Bereinigung für manuell zugewiesenen Speicher: „Neu platzieren“ und „Löschen“

In C kann die Speicherzuweisung und -freigabe manuell verwaltet werden mit den Operatoren „placement new“ und „delete“. Dies ermöglicht eine größere Flexibilität bei der Speicherverwaltung, bringt aber auch potenzielle Fallstricke mit sich. Sehen wir uns den richtigen Ansatz zum Freigeben von zugewiesenem Speicher mithilfe von „placement new“ genauer an.

Betrachten Sie die folgenden Codeausschnitte:

<code class="cpp">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
<code class="cpp">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

In beiden Beispielen wird Speicher mithilfe von „Low“ zugewiesen -Level-Operator neue Funktion und in eine Leere umwandeln*. Anschließend wird im zugewiesenen Speicher mithilfe der „Placement New“-Syntax ein Pufferobjekt erstellt.

Der entscheidende Unterschied liegt jedoch in der Freigabe. Das erste Snippet versucht fälschlicherweise, den Buf-Zeiger als char* zu löschen, vorausgesetzt, der Speicherblock wurde mit dem Operator new zugewiesen. Dies führt jedoch zu einer Speicherbeschädigung.

Das zweite Snippet zeigt den richtigen Ansatz:

<code class="cpp">buf->~Buffer();
::operator delete(mem);</code>
Nach dem Login kopieren

Bei Verwendung von „placement new“ müssen Sie den Destruktor auch manuell aufrufen. Anschließend sollten Sie die Funktion „Operator delete“ aufrufen und dabei denselben Zeiger bereitstellen, der auch für den Operator „new“ verwendet wird. Dadurch wird sichergestellt, dass sowohl das Objekt ordnungsgemäß zerstört wird als auch der zugewiesene Speicher wieder für das System freigegeben wird.

Denken Sie daran, nur das zu löschen, was Sie zuweisen. Der direkte Aufruf von „operator new“ erfordert den manuellen Aufruf von „operator delete“ und des Destruktors für eine vollständige Speicherbereinigung.

Das obige ist der detaillierte Inhalt vonWie kann man 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
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!