2010-05-12 121 views
64

我最近发现std::strstream已被弃用,支持std::stringstream。自从我使用它以来已经有一段时间了,但它在那时做了我需要做的事情,所以很惊讶听到它的贬低。为什么不推荐使用std :: strstream?

我的问题是为什么做出这个决定,并且std::stringstream提供了std::strstream没有的好处?

+0

@Chris Lively:你说这只是一个命名约定问题,或者你只是在开玩笑吗? – andand 2010-05-12 15:24:17

+0

我不确定,但通过Google找到的这个网址可能会有帮助:http://andtes.com/topic/c/answers/158338-streamream-depreciation – 2010-05-12 15:24:44

+1

@andand检查Exceptional C++,在这里很好的解释。 – 2010-05-12 15:26:14

回答

88

strstream返回char *,这是非常难以管理,因为它没有说明它是如何分配的。因此不可能知道你是否应该删除它,或者打电话给free()或者完全做其他事情。关于释放它的唯一真正令人满意的方式是通过freeze()函数将其交还给strstream。这是非常不明显的,很多人都搞错了。 stringstream返回一个管理自己的字符串对象,这个对象的错误更少。

还有一个问题,即不得不使用ends来终止字符串,但我认为解除分配问题是造成弃用的主要原因。

+1

一个朋友锁保护访问器可以解决这个问题,而不需要复制当前解决方案的数据副本。 {std :: bufferguard f(mystream); printf(“%s \ n”,f.str()); } – 2015-04-28 19:27:35

11

A strstream构建了char *。 A std::stringstream构建std::string。由于缓冲区溢出的潜在可能性,我认为strstream s已被弃用,这是std::string自动阻止的。

+0

strstream实际上并没有构建char * ...它只是在内部分配的缓冲区末尾添加一个空值。问题是奇怪的访问者“冻结”......应该作为一名警卫来实施。 – 2015-04-28 19:28:55

15

更容易理解内存管理。 (有人记得是谁负责释放分配的内存和在哪些条件下?)

(请注意,由于strstream仍提供其他地方无法提供的某些内容,它将继续存在于C++ 0X中 - at最少一次我检查了它的草稿)。

+5

如果你提供缓冲区,你有责任释放它。如果它提供了缓冲区,它将释放它,但是你必须记住解冻流,否则它不会。 'c_str = stream.str();/*使用c_str */stream.freeze(false);' – 2010-05-12 15:53:26

7

从不止一次的个人角度来看,我已经看到了模糊的内存损坏,需要几天或几周的时间来追踪并最终归结为使用strstream。一旦它被替换为stringstream,腐败消失了,我没有再问任何问题!这对我来说就够了。

相关问题