wchar_t* in einen anderen wchar_t* kopieren



  • Hallo ,

    wchar_t*     swNach ;   
         std::wstring sNach; 
    
         USES_CONVERSION; 
         swNach = A2W( sVon.c_str());    //char* in wchar*
    

    Habe nachgelesen, der swNach zeigt jetzt auf einen Puffer , der mit
    dem Makro USES_CONVERSION erzeugt worden ist.

    Wenn die nächste Anweisung kommt , dann wird der Puffer überschrieben.
    Deswegen muss ich das Ergebnis ( den wchar* ) kopieren. Etwa mit strcpy
    Aber strcpy kopiert ja den char*.

    Habe gedacht , es gibt wstrcpy. Bekomme aber einen Fehler.

    Weiß jemand wie man einen wchar_t* kopiert ?

    Mfg , Elke



  • Erstens: basic_string<>'s verwalten ihren eigenen Speicher, das heißt mit einem "sNach = swNach;" (oder sogar "sNach = A2W(sVon.c_str());") kopierst du die Daten in einen "sicheren" Speicherbereich.

    Zweitens: Afaik bereitet USES_CONVERSIONS nur die Speicherverwaltung vor - jeder Aufruf von A2W() und Kollegen greift dann ein eigenes Stück vom Stack ab.

    Drittens: Die wchar_t-Version von strcpy() heißt wcscpy()



  • Ehm, also stringA = stringB kopiert nichts! Die string Klasse von C++ macht ein Copy-on-Write, d.h. erst wenn sich ein String-Inhalt ändert, wird eine Kopie angelegt. Solange wird auf den gleichen String-Inhalt von zwei Strings verwiesen.

    Also erst bei einem .c_str() dürfte es ein Kopieren geben... aber das muß man ausprobieren. Weiß ich jetz nicht genau.



  • Hallo CStoll,

    Vielen Dank .
    Habe aber noch eine Frage , vielleicht kannst du mir weiterhelfen.

    wchar_t*     swNach ;   
         std::wstring sNach; 
    
         USES_CONVERSION; 
         swNach = A2W( sVon.c_str());
    

    Das Ergebnis swNach ist ein wchar_t*. Die Konvertierung hat geklappt ,
    der Wert steht auch drin.

    Diesen wchar* möchte ich als wstring ausgeben.
    Und mache es so:

    std::wstring p_sNach = std::wstring( swNach );

    Leider hat p_sNach dann keinen Wert.

    Komisch, weil der wstring so einen Konstruktor hat.

    Mfg , Elke



  • Artchi schrieb:

    Ehm, also stringA = stringB kopiert nichts! Die string Klasse von C++ macht ein Copy-on-Write, d.h. erst wenn sich ein String-Inhalt ändert, wird eine Kopie angelegt.

    Meines Wissens schreibt der Standard aber keine Copy Semantik vor, dh da kann jede Implementierung ihr eigenes Süppchen kochen.

    @Elke
    Also

    std::wstring p_sNach = swNach;
    

    sollte problemlos funktionieren, falls swNach ein C-String ist (oh mann, mir rollen sich die Fussnägel hoch, wenn ich diese UN Kryptik sehe 🙂 ). Was steht denn in swNach?


Anmelden zum Antworten