为什么std :: strstream已被弃用?

and*_*and 69 c++ stringstream strstream

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

我的问题是为什么做出这个决定,以及没有std::stringstream提供哪些好处std::strstream

小智 93

strstream返回了char *,这是非常难以管理,因为无处它指出它是如何被分配.因此,无法知道您是应该删除它还是在其上调用free()或完全执行其他操作.关于唯一真正令人满意的方式来释放它是把它回strstream通过freeze()功能.这是非常明显的,很多人都弄错了.将stringstream返回一个String对象,其管理本身,这是远远不容易出错.

还有一个问题是必须使用ends终止字符串,但我认为解除分配问题是弃用的主要原因.

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

APr*_*mer 15

更容易理解内存管理.(有人能记得谁负责释放分配的内存以及在哪些情况下?)

(请注意,由于strstream仍然提供其他地方无法提供的东西,它将继续存在于C++ 0X中 - 至少上次我检查它的草稿时).

  • 如果您提供缓冲区,则您有责任将其释放.如果它提供了缓冲区,它将释放它,但你必须记住解冻流或它不会.`c_str = stream.str();/*使用c_str*/stream.freeze(false);` (5认同)

Ken*_*oom 11

A strstream建立一个char *.A std::stringstream建立一个std::string.我认为strstreams已被弃用,因为缓冲区溢出的可能性,这是std::string自动阻止的.


Com*_* 10 7

从不止一次的个人角度来看,我看到了模糊的内存损坏,需要花费数天或数周的时间来追踪并最终降低使用率strstream.一旦它被stringstream腐败所取代,消失了,我没有再问任何问题了!这对我来说已经足够了.