wie kann ich das besser machen
-
so sieht das bis jetzt aus.
int CTest::cTow(LPWSTR wszdes, LPSTR szsrc) { int iSrcLen = strlen(szsrc); wszdes = new WCHAR[iSrcLen]; int iBytesCopied = MultiByteToWideChar( CP_ACP, 0, szsrc, -1, wszdes, sizeof(WCHAR) * iSrcLen); return iBytesCopied; }aber wenn ich z.B. folgendes mache, entsteht da nicht ein speicher leak?
da b ein speicher von heap angefordert hat, und in der cTow funktion ebenfalls neue anfordert und die neue addy zuweisst? wie kann ich das verbieten, weiss momentan nix weiter.// main.cpp CTest a; LPSTR c = "hallo"; LPWSTR b = new WCHAR[100]; a.cTow(b, c);so geht es zwar, aber man wird es irgendwann vl vergessen, wieder mit new WCHAR anzufordern, deshalb will ich so anstellen, dass da auch funktioniert, wenn schon speicher angefordert wurde, dann soll es sich keine neue holen.
// main.cpp CTest a; LPSTR c = "hallo"; LPWSTR b; a.cTow(b, c);
-
JnZn558 schrieb:
wie kann ich das verbieten, weiss momentan nix weiter.
Indem du Klassen verwendest die die Speicheranforderungen intern regeln. z.B. std::string, std::wstring. Obs sowas für die WinAPI-Char-Arrays gibt weiß ich ncht, da solltest du allerdings dann besser im WinAPI-Forum fragen.
In C ists normalerweise so geregelt, dass in den Kopierfunktionen kein neuer Speicher angelegt wird sondern dass die Funktionen davon ausgehen, dass hinter dem übergebenen Pointer genug Speicher vorhanden ist.
Noch ein Tip: nimm aussagekräftigere Namen. Abkürzungen etc. machen den Code eher unleserlich.
-
Benutze doch die Hilfsklassen und Typedefs von ATL.
CA2W, CW2A, CT2A, CT2W...(#include <atlbase.h>)
Simon