std::string



  • Hallo!

    std::string str = "hallo";
    char * cstr = str.c_str();
    

    Wann wird der speicherbereich auf den cstr dann verweist wieder freigestellt?

    * wenn sich str ändert? (weil intern dann der alte string deleted wird)?
    * nie? ich muss selbst aufräumen?
    * bei zerstörung des str-objects?

    hilfe!

    gruß
    marcel



  • na dann überleg mal...

    cstr ist was für ein Typ?
    c_str() gibt was zurück?



  • Chris++ schrieb:

    na dann überleg mal...

    cstr ist was für ein Typ?
    c_str() gibt was zurück?

    einen zeiger auf ein char.
    eine antwort/erklärung wäre mir lieber, als ein ratespiel.
    weil ohne überlegen hätte ich hier nicht gepostet.

    meine frage ist, woher ich wissen soll was die string klasse da macht.
    sie gibt mir da nur eine speicheradresse zurück. woher soll ich wissen was mit dem speicher auf dieser speicheradresse passiert?

    wie gesagt 3 möglichkeiten:

    * der speicher wird irgendwann von string freigestellt, wenn sich str ändert.
    * string räumt das nie auf. ich muss das machen.
    * string räumt alle allokierten speicherbereiche in seinem destruktor auf

    ich würde gerne wissen was zutrifft oder viell etwas ganz anderes?



  • MSDN schrieb:

    basic_string::c_str
    const E *c_str() const;

    The member function returns a pointer to a nonmodifiable C string constructed by adding a terminating null element (E(0)) to the controlled sequence. Calling any non-const member function for *this can invalidate the pointer.

    kompiliert dein Quellcode?



  • Pellaeon schrieb:

    MSDN schrieb:

    basic_string::c_str
    const E *c_str() const;

    The member function returns a pointer to a nonmodifiable C string constructed by adding a terminating null element (E(0)) to the controlled sequence. Calling any non-const member function for *this can invalidate the pointer.

    kompiliert dein Quellcode?

    ja, so:

    std::string str = "hallo";
    const char * cstr = str.c_str();
    


  • Um das Freistellen des Speichers kümmert sich die string-Klasse. Deswegen wird auch const(!!!)-Zeiger zurück geliefert. Man bekommt sozusagen Leserechte auf den Inhalt des Strings als char*, aber die Verwaltung des Speichers bleibt trotzdem in der Klasse. Das ist auch gut so. 🙂

    Wichtig ist zu beachten, dass der zurück gegebene Zeiger ungültig werden kann, wenn man an dem string eine Operation vornimmt.



  • Pellaeon schrieb:

    Um das Freistellen des Speichers kümmert sich die string-Klasse. Deswegen wird auch const(!!!)-Zeiger zurück geliefert. Man bekommt sozusagen Leserechte auf den Inhalt des Strings als char*, aber die Verwaltung des Speichers bleibt trotzdem in der Klasse. Das ist auch gut so. 🙂

    Wichtig ist zu beachten, dass der zurück gegebene Zeiger ungültig werden kann, wenn man an dem string eine Operation vornimmt.

    super 🙂 danke! ok, das wäre also möglichkeit 1 🙂
    also ist der pointer auch ungültig, wenn das string object selbst stirbt. klar.
    danke!

    aber eins noch:
    der zeiger ist doch garnicht const, oder?

    const char *s; // string ist const
    char * const s; // zeiger ist const
    

    oder irre ich mich da jetzt? ich darf den inhalt nicht verändern. den im endeffekt kopierten zeiger darf ich schon verändern (woanders hinzeigen lassen). das würde das string object ja auch nicht weiter tangieren.



  • string s = "Hallo";
    
    string *p = &s;  //Variabler Zeiger, variables Objekt
    
    const string *p2 = &s;  //Variabler Zeiger, konstantes Objekt
    //string const *p2 = &s;  //ebenso: Variabler Zeiger, konstantes Objekt
    
    string * const p3 = &s; //Konstanter Zeiger, variables Objekt
    
    const string * const p4 = &s;  //Konstanter Zeiger, konstantes Objekt
    


  • adsci schrieb:

    ich darf den inhalt nicht verändern. den im endeffekt kopierten zeiger darf ich schon verändern (woanders hinzeigen lassen). das würde das string object ja auch nicht weiter tangieren.

    rischdisch 👍


Log in to reply