Почему 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
коррупция исчезла, и я больше не задавал вопросов! Этого было достаточно для меня.