C++ stringstream是如何工作的?
我正在程序中使用C++ stringstream是如何工作的?,c++,stringstream,C++,Stringstream,我正在程序中使用stringstreamtype变量。 以下是代码片段: stringstream keyvalueStream; keyvalueStream << // appending some string somefun(keyvalueStream.str().c_str()); // Passing the char* keyvalueStream.str(std::string()); // clearing the content of this variab
stringstream
type变量。
以下是代码片段:
stringstream keyvalueStream;
keyvalueStream << // appending some string
somefun(keyvalueStream.str().c_str()); // Passing the char*
keyvalueStream.str(std::string()); // clearing the content of this variable.
stringstream-keyvalueStream;
当到达keyvalueStream.str(std::string())时,keyvalueStream;在你的代码片段中有一些有趣的东西(keyvalueStream.str().c_str());已经完成了执行,所以没有。如果这是你的问题。没有,它不会影响你已经传递给somefun()的内容。stringstream::str()按值返回,因此您可以获得流中数据的副本,而不是对它的引用。是。会的
然而,一旦你得到了底层的str
,你甚至不应该调用c\u str()。它一直可用到表达式末尾
从
注释
str返回的基础字符串的副本是一个临时对象,将在表达式末尾被销毁,因此直接对str()的结果调用c_str()(例如在auto*ptr=out.str().c_str();)会导致指针悬空
您的问题的答案取决于somefun
对传递给它的char const*
做了什么,而不取决于是否清除stringstream
的内容
按值返回std::string
对象,因此以后是否清除stringstream
内容无关紧要
在表达式中
somefun(keyvalueStream.str().c_str());
当对somefun
的调用返回时,返回的string
对象将被销毁。因此,如果somefun
以某种方式存储char const*
以供以后使用,那么您将有未定义的行为。如果它在当前函数调用中按需要对参数进行操作,那么您的代码是安全的。@juanchopanza:对象只有在somefun
返回(完整表达式的结尾)后才会死亡,那么在我的情况下我该怎么办?有什么建议吗?上面的ans表示它不会影响?问题中没有足够的信息来说明OP是否应该对返回的字符串调用c_str
。-1,“表达式结尾”在somefun
返回之后,这已经足够晚了。您引用的cppreference
中的示例不适用于此问题。