Почему std:: strstream не рекомендуется?

Недавно я обнаружил, что std::strstream устарел в пользу std::stringstream. Прошло некоторое время с тех пор, как я использовал его, но он сделал то, что мне нужно было делать в то время, поэтому был удивлен, услышав об этом.

Мой вопрос: почему было принято это решение и какие преимущества предоставляет std::stringstream, которые отсутствуют в std::strstream?

Ответ 1

strstream возвратил char *, с которым было очень сложно управлять, поскольку нигде не было указано, как оно было выделено. Таким образом, было невозможно узнать, следует ли его удалить или вызвать free() на нем или сделать что-то еще полностью. О единственном действительно удовлетворительном способе освободить его было вернуть его обратно в strstream с помощью функции freeze(). Это было достаточно неочевидно, что многие люди ошибались. stringstream возвращает строковый объект, который управляет собой, что гораздо менее подвержено ошибкам.

Также возникла проблема использования ends для прекращения строки, но я считаю, что проблема освобождения была основной причиной устаревания.

Ответ 2

Легче понять управление памятью. (Может ли кто-нибудь помнить, кто отвечает за освобождение выделенной памяти и в каких условиях?)

(Обратите внимание, что поскольку strstream по-прежнему предоставляет то, что недоступно в другом месте, оно будет по-прежнему присутствовать в С++ 0X - по крайней мере, в последний раз, когда я проверил черновик).

Ответ 3

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

Ответ 4

С личной точки зрения я неоднократно видел неясные повреждения памяти, которые занимали дни или недели, чтобы отследить и в конечном итоге спустились к использованию strstream. Как только он был заменен на stringstream, коррупция исчезла, и я больше не задавала никаких вопросов! Этого было достаточно для меня.