我最近发现 std::strstream
已被弃用,推荐使用 std::stringstream
。虽然我已经有一段时间没有使用它了,但是在那个时候它确实能够满足我的需求,因此听到它已被弃用感到惊讶。
我的问题是,为什么做出这个决定,并且 std::stringstream
提供的哪些优点在 std::strstream
中不存在?
我最近发现 std::strstream
已被弃用,推荐使用 std::stringstream
。虽然我已经有一段时间没有使用它了,但是在那个时候它确实能够满足我的需求,因此听到它已被弃用感到惊讶。
我的问题是,为什么做出这个决定,并且 std::stringstream
提供的哪些优点在 std::strstream
中不存在?
strstream
返回的char *
非常难以管理,因为没有地方说明它是如何分配的。因此不可能知道你是否应该删除它或调用free()函数或完全做其他事情。唯一真正令人满意的释放它的方法是通过freeze()
函数将其交还给strstream
。这是非常不明显的,很多人都会做错。而stringstream
返回一个自我管理的字符串对象,这要容易得多,也不容易出错。
还有使用ends
终止字符串的问题,但我认为释放内存的问题是弃用的主要原因。
std::stringstream
永远不会完全取代std::strstream
。在某些方面,std::strstream
比std::stringstream
更加出色。幸运的是,在C++23中我们将有std::spanstream
可用。 - frozenca更易理解的内存管理。(有人能记住谁负责释放分配的内存以及在什么情况下吗?)
(请注意,由于strstream仍提供了一些其他地方不可用的东西,它将继续存在于C++0X中--至少在我检查过草案时是这样的)。
c_str = stream.str(); /*使用 c_str*/ stream.freeze(false);
- Dennis Zickefoosestrstream
构建一个char *
。而std::stringstream
构建一个std::string
。我认为strstream
已经被弃用,因为存在缓冲区溢出的潜在风险。而std::string
则自动防止了这种情况。
从个人角度来看,我曾多次遇到不明显的内存损坏问题,这些问题需要花费数天或数周才能追踪,最终发现是使用了 strstream
。一旦将其替换为stringstream
,问题就解决了,我也不再深究了!
strstream
已经在每个标准中被弃用了,我仍然感到困惑的是为什么它们曾经被添加到标准中... - MFH