Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » string.c_str()

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
12.02.2003, 13:14 Uhr
MarcDuerner



Hi,
In der normalen C++ string Klasse gibt es eine Funktion c_str() die ein const char*
zurückgibt. Wohin zeigt der Zeiger denn? muss man das free()'en?

const char* get_string()
{
string s = "Hallo";
return s.c_str();
}

was mache ich, wenn ich die Funktion get_string() aufrufe? Muss man den
const char* free()'en oder nicht? Oder geht die Funktion nicht, weil das
char array im scope von get_string existiert?

Marc
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.02.2003, 13:28 Uhr
virtual
Sexiest Bit alive
(Operator)


Das Char Array existiert solange, wie der String s existiert; Der String, von dem du das Char Array anforderst, ist auch für dessen beseitigung zuständig. Daher funktioniert obiger Code nicht: Wenn Die Funktion zurückkehrt, wird auch s selbst eleminiert, folglich auch das char Array.
Die lösung bestünde also darin zu sagen:

C++:
string get_string()
{
    return string("Hallo");
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.02.2003, 22:35 Uhr
daniel



hmm, aber der Wert, also "Hallo" wird doch an die aufrufende Funktion zurueckgeliefert?. Nur s ist verschwunden. aber ein


C++:
char* bla = new char[123];
bla = get_string();
cout<<bla;



muesste doch auf dem Bildschirm in Marcs Beispiel ein "Hallo" ausgeben..
--
Im uebrigen bin ich der Meinung, dass M$ zerstoert werden muesste.

Dieser Post wurde am 14.02.2003 um 22:35 Uhr von daniel editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.02.2003, 00:08 Uhr
virtual
Sexiest Bit alive
(Operator)



C++:
const char* get_string()
{
string s = "Hallo";
return s.c_str();
}
...
char* bla = new char[123];
bla = get_string();


Meinst Du so? - Dann sind da direkt zwei Fehler drin:
bla ist ein Zeiger auf 0-N char. Du gehst zunächst hin und weist dem Zeiger einen Pointer auf 123 chars zu, die Du dir mit new besorgst. Danach rufst Du get_string auf. Das gibt Dir einen neuen Pointer (der wie gesagt jetzt ungültig ist) und den weist du bla zu. In der folge geht also der Wert von bla verloren und du hast ein Memoryleak.
Es kann sein, daß Du nach wie vor "Hallo" auf den Bildschirm siehst. Das ist richtig. Aber das ist dann eher Zufall. Wir hatten neulich einen ähnlichen Thread, wo ich auch die drei üblichen Ansätze Beschrieben habe, das Problem zu umgehen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: