Почему std::strstream устарел?

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

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

4 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам