Wenn ich ein neues BSTR mit SysAllocString über ein wchar_t * auf dem Heap allokiere, sollte ich dann das ursprüngliche wchar_t * auf dem Heap freigeben?
So ist das der richtige Weg?
%Vor%Soll ich hier löschen, um den Speicher freizugeben? Oder wurde diese Erinnerung gerade vom BSTR angenommen?
Wie sein Name andeutet, weist SysAllocString
seinen Speicher zu, er "adoptiert" nicht den Speicher seines Arguments. BSTRs haben die Größenvorgabe und nullterminiert, daher ist das Übernehmen einer c-artigen Zeichenfolge unmöglich, da für das Größenpräfix kein Platz ist.
SysAllocString (), von der Dokumentation , verhält sich so:
Diese Funktion weist eine neue Zeichenfolge zu und kopiert die übergebene Zeichenfolge hinein.
Wenn Sie also SysAllocString aufgerufen haben, können Sie Ihr ursprüngliches Zeichenfeld freigeben, da die Daten in den neu zugewiesenen BSTR kopiert wurden.
Der richtige Weg, um eine Zeichenfolge von wchar_t
zu löschen, die mit new[]
zugewiesen wurde, ist die Verwendung von delete[]
.
Die richtige Methode zum Freigeben von BSTR
ist mit SysFreeString () :
Während Sie noch keine Erfahrung mit BSTRs haben, sollten Sie Erics Complete Guide to BSTR Semantics lesen .
Die Dokumente für SysAllocString()
sind ziemlich klar:
Diese Funktion weist einen neuen String zu und kopiert den übergebenen String hinein.
Die String-Daten, die Sie übergeben, werden kopiert - SysAllocString()
verwendet sie nach der Fertigstellung nicht - Sie können diesen Puffer freigeben oder ändern.
Um wchar_t*
in OLECHAR*
zu konvertieren, müssen Sie % co_de verwenden % Makro:
Tags und Links string c++ windows memory-management bstr