ostringstream,.str(),以及重置/清除流

时间:2014-01-22 14:04:36

标签: c++ string stringstream temporary-objects

我正在舔Memory Error with std:ostringstream and -std=c++11?的伤口,我有一个相关的问题。

如果以下内容返回临时值,以致reserve无效且char*无效:

ostringstream oss;
oss.str().reserve(96);

// populate oss

const char* ptr = oss.str().c_str();
// do something with ptr

然后,以下内容如何清除ostringstream(来自How to reuse an ostringstream?):

oss.clear(); oss.str("");

我理解clear()将重置流的标志;但是当我现在理解str("")将对临时字符串而不是基础字符串进行操作。

那么str("")如何重置流?

3 个答案:

答案 0 :(得分:4)

这些是不同的功能。

oss.str()(不带参数)将副本返回到流的基础字符串,但oss.str("") 将其基础字符串设置为您传递的值(此处为空字符串:{ {1}})。

所以在""上调用clear()str("")实际上会“重置”它。

注意cppreference

上的两个签名

答案 1 :(得分:3)

不带参数调用str会返回内部字符串对象的副本。这就是为什么它是一个临时对象。使用字符串参数调用str可设置内部字符串对象的值。它不适用于临时对象。

好像你正在考虑这样:

oss.str() = "";

但这不是它的本质。您将""传递给str函数,以便将其分配给内部字符串。

与其他任何getter / setter组合没什么区别。如果您有getX(),它通常会为您提供您正在调用它的类的某个成员的副本。如果您有setX(x),则通常会设置该成员的值。在这种情况下,它们只是被称为str,但是一个接受参数而另一个不参数。

答案 2 :(得分:2)

来自this std::ostringstream::str reference

  

<强>参数

     

new_str - 基础字符串的新内容

它可以用来获取字符串,或者字符串设置为函数参数提供的字符串。