我的问题可以归结为,从stringstream.str().c_str()
返回的字符串在哪里存在于内存中,为什么不能将它分配给const char*
?stringstream,string和char *转换混淆
此代码示例将解释它比我好的
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream ss("this is a string\n");
string str(ss.str());
const char* cstr1 = str.c_str();
const char* cstr2 = ss.str().c_str();
cout << cstr1 // Prints correctly
<< cstr2; // ERROR, prints out garbage
system("PAUSE");
return 0;
}
是stringstream.str().c_str()
能分到导致我花了一段时间来跟踪bug一个const char*
假设。
加分,任何人都可以解释为什么与
cout << cstr // Prints correctly
<< ss.str().c_str() // Prints correctly
<< cstr2; // Prints correctly (???)
正确打印字符串替换cout
声明?
我编译Visual Studio 2008中
需要注意的是,做一个拷贝(就像在你的第一个例子中一样)并不一定会引入任何开销 - 如果'str()'以RVO可以踢入的方式实现(很有可能),那么编译器被允许直接将结果构建到'tmp'中,从而消除临时的;任何现代C++编译器都会在启用优化时执行此操作。当然,绑定到常量引用的解决方案可以保证不会复制,因此可能更可取 - 但我认为这仍然值得澄清。 – 2009-09-03 16:34:32
“当然,绑定到常量引用的解决方案保证没有复制”< - 它没有。在C++ 03中,复制构造函数需要可访问,并且允许实现复制初始化程序并将引用绑定到副本。 – 2009-09-03 16:38:01
你的第一个例子是错误的。由c_str()返回的值是瞬态的。在当前声明结束后不能依赖它。因此,您可以使用它将值传递给函数,但不应将c_str()的结果分配给局部变量。 – 2009-09-03 20:03:26