2

我正在用 std:ostringstream 和 -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(来自如何重用ostringstream?):

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

我了解clear()将重置流的标志;但据我所知str("")它将在临时而不是基础字符串上运行。

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

4

3 回答 3

4

这些是不同的功能。

oss.str()(不带参数)返回流的底层字符串的副本,但oss.str("") 其底层字符串设置为您传递的值(此处为空字符串:)""

因此,调用两者clear()并实际上是str("")一种std::stringstream“重置”它。

注意cppreference上的两个签名

于 2014-01-22T14:08:17.617 回答
3

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

看起来你是这样想的:

oss.str() = "";

但事实并非如此。您正在传递""str函数,以便它可以将其分配给内部字符串。

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

于 2014-01-22T14:07:17.480 回答
2

这个std::ostringstream::str参考

参数

new_str - 基础字符串的新内容

它可用于获取字符串,或将字符串设置为函数参数提供的字符串

于 2014-01-22T14:07:24.883 回答