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?


@ 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.


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).


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.