Kann ich Speicher freigeben, der an SysAllocString übergeben wurde?

7

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?

    
noctonura 20.04.2010, 17:04
quelle

5 Antworten

9

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.

    
Éric Malenfant 20.04.2010, 17:07
quelle
10

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[] .

%Vor%

Die richtige Methode zum Freigeben von BSTR ist mit SysFreeString () :

%Vor%

Während Sie noch keine Erfahrung mit BSTRs haben, sollten Sie Erics Complete Guide to BSTR Semantics lesen .

    
i_am_jorf 20.04.2010 17:17
quelle
3

Ja, delete der Speicher.

    
John Dibling 20.04.2010 17:09
quelle
3

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.

    
Michael Burr 20.04.2010 17:17
quelle
0

Um wchar_t* in OLECHAR* zu konvertieren, müssen Sie % co_de verwenden % Makro:

%Vor%     
Kirill V. Lyadvinsky 20.04.2010 17:22
quelle