为什么不推荐使用std :: strstream?


75

我最近发现std::strstream已弃用,而赞成std::stringstream。自从我使用它已经有一段时间了,但是它做了我当时需要做的事情,所以听到它被弃用感到惊讶。

我的问题是为什么要做出这个决定,而std::stringstream提供的好处是什么std::strstream呢?


@Chris Lively:您是说这只是一个命名约定问题,还是在开玩笑?
and

我不确定,但是通过Google找到的URL可能会有所帮助:bytes.com/topic/c/answers/158338-strstream-depreciation
Will Bickford 2010年

1
@andand检查杰出的C ++,在那里很好地解释了。
我们无能为力2010年

@andand:这是个玩笑。;)我相信下面的Ken给出了正确的答案
NotMe,2010年

1
@Christ Lively:感谢您的澄清。我以为你可能在开玩笑,但是有时候很难说出来。
andand 2010年

Answers:


96

strstream返回了char *,这是非常难以管理,因为无处它指出它是如何被分配。因此,不可能知道应该删除它还是对其调用free()或完全执行其他操作。唯一真正令人满意的解除分配方法是strstream通过freeze()函数将其交还给via 。这显然不够明显,以至于很多人都弄错了。将stringstream返回一个String对象,其管理本身,这是远远不容易出错。

还有一个必须使用ends终止字符串的问题,但我相信释放问题是不赞成使用的主要原因。


2
一个朋友锁防护访问器将解决此问题,而无需复制数据副本,这是当前的解决方案。{std :: bufferguard f(mystream); printf(“%s \ n”,f.str()); }
Erik Aronesty

笑的人使用strstream不仅是因为他们希望有记忆maangement的控制
马丁科希策

15

更容易理解内存管理。(有人能记得谁负责在什么情况下释放分配的内存吗?)

(请注意,由于strstream仍然提供其他地方无法提供的功能,因此它将继续存在于C ++ 0X中-至少是上次我检查草案时是这样)。


5
如果提供缓冲区,则您有责任释放它。如果它提供了缓冲区,它将释放它,但是您必须记住要取消冻结流,否则不会。c_str = stream.str(); /*use c_str*/ stream.freeze(false);
丹尼斯·齐克福斯

11

Astrstream建立一个char *。Astd::stringstream建立一个std::string。我认为strstreams已被弃用,因为它可能会std::string自动阻止缓冲区溢出。


strstream实际上并没有构建char * ...,只是在内部分配的缓冲区的末尾添加了一个null。问题是奇怪的访问器“冻结”……应该作为警卫来实施。
Erik Aronesty

7

从个人的角度来看,我不止一次看到晦涩的记忆破坏,历经数天或数周才能追踪,最终归结为使用strstream。一旦被stringstream腐败取代,它就消失了,我没有再问任何其他问题了!这对我来说足够了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.