[c++] Speicherlecks bei Stringkonvertierungen ( BSTR über _bstr_t nach CString )

Frogger

Grünschnabel
Hallo

Ich habe eine C++ Konsolenanwendung unter Visual Studio 2005 erstellt, die den MSXM6 Parser verwendet. Die Funktionen des Parsers liefern mir an verschiedenen Stellen Strings vom Typ BSTR, die ich zur Weiterverarbeitung in CString konvertieren muss.
Wenn ich nun an entsprechenden Stellen den Test mit _CrtDumpMemoryLeaks() mache, werden Memory leaks (Speicherlecks) gemeldet. Hier ein kleines Beispiel.

Code:
BSTR strAttName;
pAttNode->get_baseName(&strAttName); //pAttNode ist vom Typ IXMLDOMNode*

_CrtDumpMemoryLeaks(); //Noch alles in Ordnung

_bstr_t strAttBTmp(strAttName, FALSE);

_CrtDumpMemoryLeaks(); //erstes Memory leak wird gemeldet

CString strAttB(static_cast<const char*>(strAttBTmp));

_CrtDumpMemoryLeaks();	//ein zweites Memory leak wird gemeldet
			//(und das erste leak wird erneut ausgegeben)


Bei der Erstellung des _bstr_t Objekts habe ich bereits etwas berücksichtigt was ich bei meiner Suche über google gefunden habe:
Ein Codeproject-Artikel über verschiedene Stringkonvertierungen enthält einen Leserkommentar, der vor Memory leaks warnt im Zusammenhang zu BSTR und _bstr_t. Auch ein weiterer Artikel bei Microsoft geht darauf ein. Die relevanten Links:

http://www.codeproject.com/KB/string/bstrsproject1.aspx
http://msdn.microsoft.com/en-us/library/aa227975.aspx

Laut diesen Quellen sollte aber das "FALSE" flag ,das ich bei der Erzeugung des _bstr_t mitgebe, eigentlich ausreichen um das erste Memory leak zu beseitigen, aber es tritt trotzdem auf. Ausserdem erhalte ich ein zweites Memory leak bei der Wandlung von _bstr_t nach CString ...

Ich habe gehört dass es auch "false positives" gibt, also Fälle in denen Memory leaks gemeldet werden, obwohl keine vorhanden sind. Könnte das für das obere Beispiel zutreffen ? Wenn ich _CrtDumpMemoryLeaks() nur einmal am Ende der tmain() Funktion aufrufe, werden keine Memory leaks gemeldet. Lediglich wenn ich die Aufrufe direkt in den Funktionen platziere, in denen die String Konvertierungen stattfinden erhalte ich die Meldungen. Wenn es sich um wirkliche Memory leaks handeln würde, müssten dann nicht alle Leaks gemeldet werden die bis zum Aufruf von _CrtDumpMemoryLeaks() aufgetreten sind, auch wenn dieser Aufruf erst beim Beenden des Programms stattfindet ?

Falls es sich um echte Leaks handelt, wie könnte ich sie vermeiden ?

Danke im Vorraus
Frogger
 
Hm. Normalerweise sollte BSTR doch eher in einen wchar_t umgewandelt werden, oder?

C++:
::BSTR attribute_name;
pAttNode->get_baseName(&attribute_name);

CString strAttB(static_cast<const wchar_t*>(attribute_name));
;) Notfalls CComBSTR mal angucken!
 
Zurück