CString Aufklärung



  • danke für die detailierte Antwort.

    CString erstellt bei = immer einen neuen String.. Dabei kann char* und wchar_t* automatisch in einen CString konvertiert werden...

    richtig?



  • Fast - CString arbeitet afaik ENTWEDER mit char ODER mit wchar_t, aber nicht mit beidem gemischt.



  • ok, danke. Aber wie sieht es aus wenn ich ein wchar_t* habe und diesen statt 20 später auf 30 erhöhen möchte. Ist das dynamisch möglich?

    wchar_t* z;

    z = new wchar[20];

    int i = 30;

    // hier z auf [i] erhöhen;

    delete[] z;



  • Ja, aber das mußt du fast von Hand erledigen (und dir die bisherige Größe mitschreiben):

    int size = 20;
    char* data = new char[size+1];//Platz für den Null-Terminator
    
    ...
    char* tmp = new char[nsize+1];//größeres Array holen
    memcpy(tmp,data,min(size+1,nsize));tmp[nsize]='\0';//Daten kopieren
    delete[]data;
    data=tmp;
    

    Aber besser ist es, du nimmst eine fertige Containerklasse, die sich um solche Details kümmert (z.B. CString oder std::string/std::wstring).



  • geht das auch irgendwie mit malloc? ich möchte ja nicht den char* nochmal neu anlegen sondern nur erweitern...



  • Ich habe eure Antworten nur überflogen...
    Zu deiner ersten Frage:

    CString s1;
    CString s2;
    
    s2="hallo";
    
    s1 = s2;
    

    Hier wird an s1 nur der Zeiger von s2 weitergegeben. Erst wenn du s1 oder s2 änderst wird wirklich eine Kopie erstellt. Siehe auch Reference Counting.



  • Hier wird an s1 nur der Zeiger von s2 weitergegeben. Erst wenn du s1 oder s2 änderst wird wirklich eine Kopie erstellt. Siehe auch Reference Counting.

    Bist du dir richtig sicher? s2 wird ja nicht bei der deklararion zugewiesen, sondern wird ja schon geändert (nach der Dekl.)

    Also sieht für mich nach Copy aus oder?



  • Ja ich bin mir sicher. Bei der Zuweisung

    s1 = s2
    

    wird zunächst der Zeiger des internen Buffers von s1 einfach auf die Adresse vom internen Buffer von s2 gesetzt. Wenn man danach einen der beiden ändert wird eine Kopie erstellt. Was davor passiert ist egal.



  • das gilt aber nur für 2 CStrings. Die Zuweisung eines wchar_t* oder char* erzwingt wohl immer ein COPY oder?



  • ja.
    Bei

    s2="hallo";
    

    wird natürlich kopiert.



  • vielen Dank!

    Grüße Rio.


Anmelden zum Antworten