SysFreeString BSTR
-
Guten Abend
Ich hab mir soeben ein Programm für das finden von Speicherlecks heruntergeladen. (Visual Leak Detector)
Komischerweise zeigt er hier nichts an, und das verunsichert mich jetzt sehr.Muss ich eine BSTR-Variable immer zurücksetzen?
Danke für die Hilfe.
wachs
Hier ein Beispiel.
#define _MAX 50 BSTR getBSTR(wchar_t *w){ _bstr_t b(w); return b.copy(); } int _tmain(int argc, _TCHAR* argv[]) { wchar_t wc[]=L"Ich bin ein String"; wchar_t *w=new wchar_t[_MAX]; wmemset(w,0,_MAX); wmemcpy(w,wc,std::wcslen(wc)); BSTR b=getBSTR(w); delete [] w; //Hier muss ich doch die Variable b zurücksetzen mit ... SysFreeString(b); return 0; }
-
Was sind Speicherlecks?
-
-
Die Frage kann wohl umformuliert werden, wie ein BSTR intern aufgebaut ist und warum die fehlende Freigabe dieser Ressource nicht erkannt wird. Nichts davon hat direkt mit C++ zu tun, passend wäre eines der Unterforen zu den diversen Microsoft-Frameworks. Ich kenne mich damit aber nicht aus und kann nicht entscheiden, wo eine Frage zu BSTR am besten aufgehoben wäre.
-
Danke für die Antwort SeppJ
Ich hab jetzt mal einen Versuch mit
_CrtDumpMemoryLeaks();gestartet, und 'SysFreeString(b);' auskommentiert.
Die Ausgabe sieht so aus:
No memory leaks detected.PS. Ich hab vorher noch das hier gefunden.
https://www.c-plusplus.net/forum/209449-fullgruss wachs
-
Das ist alles irgendwie nicht konsistent. Benutz einfach _bstr_t, das verhält sich so ähnlich wie std::string (macht aber ref counting) und kümmert sich selber um die Ressourcen.
Warum erstellst du überhaupt ein wchar_t array auf dem Heap? Nur um den Leak Detector zu testen?
-
ja genau nur zu testzwecken. Soll nur als Beispiel dienen.
wachs
-
Und worauf genau willst du dann hinaus? Du rufst _bstr_t auf, das wird wohl SysAllocString aufrufen. Dann rufst du SysFreeString auf. Was willst du mehr?
Im übrigen glaub ich nicht, dass VLD solche Spezialfälle kennt.
-
Ich glaub du hast recht. VLD ist nur für malloc -Free und New - Delete.
Das mit '_bstr_t' hat mich total verwirrt. Verhält sich wie ein smartpointer.
Ich seh leider nicht weiter in den Code rein, wenn eine kopie gemacht wird, darum war ich auch so unsicher, was jetzt genau gemacht wird.Aber ich denke sow ie ich es jetzt gemacht habe (mit 'SysFreeString(b);' auskommentiert.) ist das schon richtig.
Danke trozdem.
wachs
-
Es wäre noch besser, einfach nur _bstr_t zu verwenden, ohne copy.
-
werde ich noch ausprobieren.
-
@wachs
VLD findet kein Leak, weil VLD per Default nur Allokationen betrachtet die in der eigenen EXE bzw. eigenen DLLs gemacht werden.Du kannst VLD aber so konfigurieren dass die
oleaut32.dllebenfalls überwacht wird. Bei mir wurden BSTR Leaks dann korrekt gefunden & gemeldet.
-
Hallo hustbaer
Danke für die Antwort.
Wie hast du das auch hingekriegt?. Hast du diesbezüglich ein Hinweis, dem ich mal nachgehen kann, ich seh da leider noch nicht durch.
danke wachs
-
Homepage gucken, beschrieben da steht?
.ini File?