004
17.09.2003, 14:08 Uhr
virtual
Sexiest Bit alive (Operator)
|
In Vor Standardzeiten gab es bereits eine strstream Klasse, die im Zuge der Standardisierung von stringstream abgelöst wurde. Aus Kompatibilitätsgründen wird der Header strstream.h und die Klasse strstream noch öfters mitgeliefert. Von der Verwendung der strstream Klasse ist jedoch dringend abzuraten, nicht nur, weil sie nicht mit zum Standard gehört: sie lädt zu Speicherlöchern ein. Das liegt daran, daß strstream::str() nicht einen std::string, sondern einen char* liefert.
Während man mit stringstream sowas hier ziemlich gefahrlos schreiben kann:
C++: |
void f() { int x; std::stringstream strm; strm<<"Hallo, x liegt an Addresse "<<&x<<std::endl;
std::cout<<strm.str(); //!! <<- Hier }
|
Würde die gleiche routine mit strstream ein Speicherloch erzeugen:
C++: |
void f() { int x; strstream strm; strm<<"Hallo, x liegt an Addresse "<<&x<<std::endl;
std::cout<<strm.str(); //!! <<- Hier jetzt speicherloch, wenn folgende Zeile nicht hinzugefügt wird: strem.freeze(false); }
|
Dh. per default geht strstream hin und schenkt dem Aufrufer den Rückgabewert von str, mit der Konsequenz, da das "Geschenk" kein Objekt einer Klasse ist, daß man es per Hand entfernen muß. freeze bewirkt, daß es wirklich abgeräumt wird.
EDIT: Ich hoffe erwähnt zu haben, daß strstream nicht Standard ist. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 17.09.2003 um 14:14 Uhr von virtual editiert. |