我正在舔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("")
如何重置流?
答案 0 :(得分:4)
这些是不同的功能。
oss.str()
(不带参数)将副本返回到流的基础字符串,但oss.str("")
将其基础字符串设置为您传递的值(此处为空字符串:{ {1}})。
所以在""
上调用clear()
和str("")
实际上会“重置”它。
答案 1 :(得分:3)
不带参数调用str
会返回内部字符串对象的副本。这就是为什么它是一个临时对象。使用字符串参数调用str
可设置内部字符串对象的值。它不适用于临时对象。
好像你正在考虑这样:
oss.str() = "";
但这不是它的本质。您将""
传递给str
函数,以便将其分配给内部字符串。
与其他任何getter / setter组合没什么区别。如果您有getX()
,它通常会为您提供您正在调用它的类的某个成员的副本。如果您有setX(x)
,则通常会设置该成员的值。在这种情况下,它们只是被称为str
,但是一个接受参数而另一个不参数。
答案 2 :(得分:2)
来自this std::ostringstream::str
reference:
<强>参数强>
new_str
- 基础字符串的新内容
它可以用来获取字符串,或者将字符串设置为函数参数提供的字符串。