我有正确运行的代码:
#include <iostream>
std::string func()
{
return "string";
}
int main()
{
std::string str = func();
std::cout << str << std::endl;
return 0;
}
但是当我将main函数更改为此时,我没有输出:
int main()
{
const char* c = func().c_str();
std::cout << c << std::endl;
return 0;
}
此主要功能正常工作:
int main()
{
std::string str = func();
const char* c = str.c_str();
std::cout << c << std::endl;
return 0;
}
我在Visual Studio中使用多字节编码。
答案 0 :(得分:4)
好吧,由于访问已释放的内存,您的第二个示例是未定义行为。任何事情都会发生。
func()
返回一个临时std::string
,其生存期在完整表达式的结尾处结束,将c
变成一个悬空指针:
const char* c = func().c_str();
禁止使用悬空指针,尤其是取消引用:
std::cout << c << std::endl;
第一个示例通过将返回值存储在变量中并打印该值来避免这种情况。
第三个方法也将返回值存储在变量中,即使出于某种不可思议的原因,它使用指向拥有序列的指针进行输出。