【发布时间】:2014-02-03 18:19:24
【问题描述】:
很多 C++ 程序员在第一次使用 stringstreams 时会忽略(阅读:我)的事实是,stringstream::str() 返回的副本是临时的,它会持续到使用它的表达式的结尾。但是,我不明白:
- 这是如何完成的。查看 libstdc++ 的
sstream标头,我只看到制作并返回了一个副本。寿命如何限制? - 为什么这是期望的行为,尤其是因为这是一个常见的问题。如果仍然在制作副本,为什么我不能拥有它?
请注意,这不是 stringstream, string, and char* conversion confusion 的副本。以上解释了行为和解决方法;我正在寻找机制和基本原理。
【问题讨论】:
-
我不确定你在问什么。
stringstream::str返回内部字符串的副本,除非我遗漏了什么。 -
这个问题存在于任何返回可以访问数据指针的东西的副本的东西。碰巧从
std::stringstream到const char *发生的频率比其他情况要高。无论如何,您说另一个答案解释了行为,但您需要机制。我不太确定如何区分它们。 -
@dauphic 我想我误解了复制的内容 - 你是说
string对象被复制得很浅,所以它指向的字符数组是共享的? -
@roysc:AlexTelishev 的回答解释了这一点。它返回内部字符串的完整副本,在销毁之前有效,但
c_str()的返回值只在表达式结束之前有效。 -
我有点困惑,为什么这么多答案都在谈论
c_str(),我在你的问题中没有看到任何地方提到这一点?他们所说的这个表达是什么?stringstream.str().c_str()?这个问题是关于str()还是c_str()?听起来主要是关于c_str()。
标签: c++ memory stringstream