Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

1

06.03.2006, 18:44

uni_cast umgeschrieben --> unzufrieden

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!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Anonymous

unregistriert

2

06.03.2006, 19:19

Ist klar wenn Du wie ein Bescheuerter immer und immer mehr Speicher allokierst und ihn am Ende vergisst freizugeben, was man bekanntermaßen SEHR GERNE bei Pointern vergisst. Dafür habe ich ja std::basic_string<T> genommen, damit ich vor solchen Sachen meine Ruhe habe, denn ich bin auch oft schlampig und vergesse delete ;)

Achja, warum kein std::basic_string<T>?

Wenn Du das nicht nehmen willst empfehle ich std::auto_ptr bzw. ne eigene Stringklasse zu schreiben die die Sache mit dem Speicher selber managet für Dich.

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

3

06.03.2006, 20:46

Also grundsätzlich wird der Speicher schon freigegeben, nur halt zu spät --> erst am Ende!

Gibt es nicht eine Möglichkeit mit basic_string<T> zu arbeiten, aber einen char* oder wchar_t* zu bekommen? Mehr oder weniger alle API-Funktionen (sei es DX oder WinAPI) verlangen ja einen StringPointer und nicht die basic_string<T>!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Anonymous

unregistriert

4

06.03.2006, 20:51

Black-Panther
std::basic_string<T>::c_str(); ist Dein Freund, gibt einen Konstanten Zeiger auf die Stringdaten zurück, benutz ich bei jeder Win32API Funktion die einen String erwartet.

Werbeanzeige