placement new und delete Rätsel
In C entsteht beim Zuweisen von Speicher mit dem Placement new-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:
const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer) strlen(charString) 1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete (char*)buf;
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:
const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer) strlen(charString) 1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete buf;
Diese Lösung versucht auch, den zugewiesenen Speicher zu löschen, 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:
buf->~Buffer();
::operator delete(mem);
Diese Lösung ruft explizit den Destruktor für das Buffer-Objekt auf (buf->~Buffer()) und gibt dann den Rohspeicher mithilfe der Operator-Delete-Funktion frei (::operator delete( mem)).
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.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3