我最近发现std::strstream
已被弃用,支持std::stringstream
。自从我使用它以来已经有一段时间了,但它在那时做了我需要做的事情,所以很惊讶听到它的贬低。为什么不推荐使用std :: strstream?
我的问题是为什么做出这个决定,并且std::stringstream
提供了std::strstream
没有的好处?
我最近发现std::strstream
已被弃用,支持std::stringstream
。自从我使用它以来已经有一段时间了,但它在那时做了我需要做的事情,所以很惊讶听到它的贬低。为什么不推荐使用std :: strstream?
我的问题是为什么做出这个决定,并且std::stringstream
提供了std::strstream
没有的好处?
strstream
返回char *
,这是非常难以管理,因为它没有说明它是如何分配的。因此不可能知道你是否应该删除它,或者打电话给free()或者完全做其他事情。关于释放它的唯一真正令人满意的方式是通过freeze()
函数将其交还给strstream
。这是非常不明显的,很多人都搞错了。 stringstream
返回一个管理自己的字符串对象,这个对象的错误更少。
还有一个问题,即不得不使用ends
来终止字符串,但我认为解除分配问题是造成弃用的主要原因。
一个朋友锁保护访问器可以解决这个问题,而不需要复制当前解决方案的数据副本。 {std :: bufferguard f(mystream); printf(“%s \ n”,f.str()); } – 2015-04-28 19:27:35
A strstream
构建了char *
。 A std::stringstream
构建std::string
。由于缓冲区溢出的潜在可能性,我认为strstream
s已被弃用,这是std::string
自动阻止的。
strstream实际上并没有构建char * ...它只是在内部分配的缓冲区末尾添加一个空值。问题是奇怪的访问者“冻结”......应该作为一名警卫来实施。 – 2015-04-28 19:28:55
更容易理解内存管理。 (有人记得是谁负责释放分配的内存和在哪些条件下?)
(请注意,由于strstream仍提供其他地方无法提供的某些内容,它将继续存在于C++ 0X中 - at最少一次我检查了它的草稿)。
如果你提供缓冲区,你有责任释放它。如果它提供了缓冲区,它将释放它,但是你必须记住解冻流,否则它不会。 'c_str = stream.str();/*使用c_str */stream.freeze(false);' – 2010-05-12 15:53:26
从不止一次的个人角度来看,我已经看到了模糊的内存损坏,需要几天或几周的时间来追踪并最终归结为使用strstream
。一旦它被替换为stringstream
,腐败消失了,我没有再问任何问题!这对我来说就够了。
@Chris Lively:你说这只是一个命名约定问题,或者你只是在开玩笑吗? – andand 2010-05-12 15:24:17
我不确定,但通过Google找到的这个网址可能会有帮助:http://andtes.com/topic/c/answers/158338-streamream-depreciation – 2010-05-12 15:24:44
@andand检查Exceptional C++,在这里很好的解释。 – 2010-05-12 15:26:14