Hallo!
Ich habe für mein Projekt den uni_cast von nix da umgeschrieben, da ich gerne char* oder wchar_t* nach der Konvertierung hätte, doch ich bin mit meiner Lösung unzufrieden, da ich den Heap zupumpe. Ich reserviere Speicher für den neuen String mit meinem Speichermanager und gebe diesen aber erst am Ende wieder frei. So kommt es dann, dass nach Programmende ca. 4000 (und mehr, wenn ichs länger laufen lasse) unfreigegebene Speicher auf dem Heap befinden, welche diesen zur Programmlaufzeit unnötig belastet hatten. Nun wollte ich fragen, gibt es da eine andere Lösung?
Hier meine bisherige Lösung
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
//Unicode nach Unicode oder ANSI nach ANSI (Standardtemplate)
template<typename A, typename T> inline A* uni_cast(const T* Source)
{
return Source;
}
//------------------------------------------------------------//
//Unicode nach ANSI (Spezialisierungstemplate)
template<> inline char* uni_cast(const wchar_t* wcSource)
{
ogMemory<char> Mem;
char *pBuffer = Mem.MemAlloc(static_cast<int>(::wcslen(wcSource) * 2));
::WideCharToMultiByte(CP_ACP, 0, wcSource, -1, pBuffer, Mem.GetSize(), NULL, NULL);
//std::basic_string<char> cChar(pBuffer);
//OG_SAFE_DELETE_ARRAY(pBuffer);
return pBuffer;
//return cChar.data();
}
//------------------------------------------------------------//
//ANSI nach Unicode (Spezialisierungstemplate)
template<> inline wchar_t* uni_cast(const char* cSource)
{
ogMemory<wchar_t> Mem;
wchar_t *pBuffer = Mem.MemAlloc(static_cast<int>(::strlen(cSource) * 2));
::MultiByteToWideChar (CP_ACP, 0, cSource, -1, pBuffer, Mem.GetSize());
//std::basic_string<wchar_t> wcRes(pBuffer);
//OG_SAFE_DELETE_ARRAY(pBuffer);
return pBuffer;
//return wcRes.data();
}
|
Das auskommentierte stellt meinen vorletzten Ansatz dar... doch das funktioniert irgendwie überhaupt nicht, außerdem muss ich dann einen const-Pointer zurückgeben, was auch nicht gerade super ist!