Warum wurde std :: strstream nicht mehr unterstützt?

74

Ich habe kürzlich festgestellt, dass std::strstreamdies zugunsten von abgelehnt wurde std::stringstream. Es ist schon eine Weile her, seit ich es benutzt habe, aber es hat das getan, was ich damals tun musste, und war überrascht, von seiner Abwertung zu hören.

Meine Frage ist, warum diese Entscheidung getroffen wurde und welche Vorteile es std::stringstreamgibt, die fehlen std::strstream?

und und
quelle
@ Chris Lively: Du sagst, dass es nur ein Problem mit der Namenskonvention war, oder machst du nur Spaß?
undund
Ich weiß es nicht genau, aber diese über Google gefundene URL könnte helfen: bytes.com/topic/c/answers/158338-strstream-depreciation
Will Bickford
1
@andand check Außergewöhnliches C ++, es wird dort gut erklärt.
Wir können
@andand: Es war ein Witz. ;) Ich glaube, Ken unten hat die richtige Antwort
NotMe
1
@Christ Lively: Danke für die Klarstellung. Ich dachte, du machst wahrscheinlich Witze, aber manchmal ist es schwer zu sagen.
undund

Antworten:

96

Die strstreamRückgabe char *war sehr schwierig zu handhaben, da nirgends angegeben wurde, wie sie zugeteilt worden war. Es war daher unmöglich zu wissen, ob Sie es löschen oder free () darauf aufrufen oder etwas ganz anderes tun sollten. Die einzige wirklich zufriedenstellende Möglichkeit, die Zuordnung aufzuheben, bestand darin, sie strstreamüber die freeze()Funktion an die zu übergeben. Dies war hinreichend nicht offensichtlich, so dass viele Leute es falsch verstanden haben. Das stringstreamgibt ein String-Objekt zurück, das sich selbst verwaltet und weitaus weniger fehleranfällig ist.

Es gab auch das Problem, endsdie Zeichenfolge beenden zu müssen, aber ich glaube, das Problem der Freigabe war der Hauptgrund für die Ablehnung.

Dan Nissenbaum
quelle
2
Ein Friend-Lock-Guard-Accessor hätte dieses Problem gelöst, ohne Kopien von Kopien von Daten zu erstellen, was die aktuelle Lösung ist. {std :: bufferguard f (mystream); printf ("% s \ n", f.str ()); }
Erik Aronesty
lol Leute benutzten strstream nur, weil sie die Kontrolle über das Gedächtnis haben wollten
Martin Kosicky
15

Einfachere Speicherverwaltung. (Kann sich jemand erinnern, wer unter welchen Bedingungen für die Freigabe des zugewiesenen Speichers verantwortlich ist?)

(Da strstream immer noch etwas bereitstellt, das an anderer Stelle nicht verfügbar ist, wird es weiterhin in C ++ 0X vorhanden sein - zumindest das letzte Mal, als ich den Entwurf überprüft habe).

Ein Programmierer
quelle
5
Wenn Sie den Puffer bereitstellen, sind Sie für die Freigabe verantwortlich. Wenn es den Puffer bereitgestellt hat, wird es freigegeben, aber Sie müssen daran denken, den Stream freizugeben, sonst wird es nicht. c_str = stream.str(); /*use c_str*/ stream.freeze(false);
Dennis Zickefoose
11

A strstreambaut a char *. A std::stringstreambaut a std::string. Ich nehme an, dass strstreams wegen des Potenzials eines Pufferüberlaufs veraltet sind, was std::stringautomatisch verhindert wird.

Ken Bloom
quelle
strstream erstellt das char * nicht wirklich ... es steckt nur eine Null am Ende des Puffers, den es intern zugewiesen hat. Das Problem war der seltsame Accessor "Freeze" ... der als Wache hätte implementiert werden sollen.
Erik Aronesty
7

Aus persönlicher Sicht habe ich bei mehr als einer Gelegenheit obskure Speicherverfälschungen gesehen, deren Aufspüren Tage oder Wochen gedauert hat und die schließlich verwendet wurden strstream. Sobald es durch stringstreamdie Korruption ersetzt wurde, verschwand es und ich stellte keine weiteren Fragen! Das hat mir gereicht.

Komponente 10
quelle