Чому std :: strstream застаріло?


76

Нещодавно я виявив, що std::strstreamце застаріло на користь std::stringstream. Минув деякий час з того часу, як я ним користувався, але він зробив те, що мені потрібно було робити в той час, тому був здивований, почувши про його припинення.

Моє питання полягає в тому, чому було прийнято це рішення, і які переваги std::stringstreamнадає відсутність std::strstream?


@Chris Lively: Ви хочете сказати, що це було лише питанням імен, або ви просто жартуєте?
andand

Я точно не знаю, але ця URL-адреса, знайдена через Google, може допомогти: bytes.com/topic/c/answers/158338-strstream-depreciation
Уілл Бікфорд,

1
@andand перевірити Винятковий C ++, там це гарно пояснено.
Ми нічого не можемо зробити

@andand: Це був жарт. ;) Я вважаю, що Кен нижче має правильну відповідь
NotMe

1
@Christ Lively: Дякую за роз'яснення. Я думав, ви, мабуть, жартуєте, але іноді важко сказати.
andand

Відповіді:


96

strstreamПовернувся через char *це було дуже важко керувати, так як ніде не було вказано , що , як це було виділено. Таким чином, було неможливо зрозуміти, чи слід видаляти його, або викликати на ньому free () або робити щось інше повністю. Приблизно єдиним задовільним способом його звільнення було повернути його назад strstreamчерез freeze()функцію. Це було досить неочевидно, що багато людей помилялися. У stringstreamповертає строковий об'єкт , який управляє собою, що набагато менше помилок.

Була також проблема необхідності використовувати endsдля завершення рядка, але я вважаю, що проблема звільнення була основною причиною припинення дії.


2
Доступник охорони друзів вирішив би цю проблему без копіювання копій даних, що є поточним рішенням. {std :: bufferguard f (mystream); printf ("% s \ n", f.str ()); }
Ерік Аронесті

лол люди використовували strstream лише тому, що хотіли мати контроль над порушенням пам'яті
Мартін Косіцкі

15

Простіше зрозуміти управління пам’яттю. (Хтось може згадати, хто відповідає за звільнення виділеної пам’яті і в яких умовах?)

(Зверніть увагу, оскільки strstream все ще надає те, що недоступне в інших місцях, він і надалі буде присутній у C ++ 0X - принаймні останнього разу, коли я перевіряв проект, який він був).


5
Якщо ви надаєте буфер, ви несете відповідальність за його звільнення. Якщо він надав буфер, він звільнить його, але ви повинні пам’ятати про те, щоб розморозити потік, а то ні. c_str = stream.str(); /*use c_str*/ stream.freeze(false);
Денніс Зікфуз,

11

A strstreamбудує a char *. A std::stringstreamбудує a std::string. Я припускаю, що strstreams є застарілою, оскільки існує можливість переповнення буфера, що std::stringавтоматично запобігає.


strstream насправді не будує char * ... він просто приклеює нуль до кінця буфера, який він виділив внутрішньо. проблема полягала в дивному "заморожуванні" доступу, який мав бути реалізований як охорона.
Ерік Аронесті

7

З особистого погляду я неодноразово бачив незрозумілі пошкодження пам'яті, для пошуку яких потрібні були дні чи тижні, і в кінцевому підсумку їх почали використовувати strstream. Щойно його замінили stringstreamкорупцією, і я більше не задавав питань! Цього мені було досить.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.