Почему std :: strstream устарел? - PullRequest
68 голосов
/ 12 мая 2010

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

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

Ответы [ 4 ]

92 голосов
/ 12 мая 2010

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

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

15 голосов
/ 12 мая 2010

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

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

11 голосов
/ 12 мая 2010

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

7 голосов
/ 15 октября 2010

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

...