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 aufich 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 constoder 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
