如果我有以下两个功能
std::string foo1()
{
std::string temp;
...
return temp;
}
和
const char* foo2()
{
std::string temp;
...
return temp.c_str();
}
和一个以const char *作为输入的函数;
void bar(const char* input) { ... }
哪一个更安全:
bar(foo1().c_str());
或
bar(foo2());
如果我想做的就是将一个字符串作为输入传递到bar,然后不关心任何foo
函数的返回值它真的重要吗?
答案 0 :(得分:8)
const char* foo2()
{
std::string temp;
...
return temp.c_str();
}
foo2()
是不安全的,你将const char*
返回给一个局部变量,该函数在函数返回时将指向垃圾。
在C ++中使用foo1
这是一种安全且惯用的方式来返回一个对象。 NRVO可能会开始
这会在foo1
返回时忽略临时副本。
std::string foo1()
{
std::string temp;
...
return temp;
}
答案 1 :(得分:6)
const char* foo2()
{
std::string temp;
...
return temp.c_str();
}
根本不安全,因为temp
将被销毁,所以你将返回一个悬空指针。
答案 2 :(得分:2)
巴(foo2的());这是完全错误的......因为当foo2返回时,temp std :: string被销毁,c_str()返回的指针现在指向一个无效的位置。
答案 3 :(得分:2)
只要原始字符串对象未被销毁,c_str的字符数组就是有效的。 This has been asked before.。在函数结束时,temp
被销毁,这意味着foo2()
返回无效指针。
答案 4 :(得分:1)
foo2
版本不安全,因为c_str()
返回的指针无效,因为从std::string
返回时temp
foo2
被销毁。 foo1
更安全,因为它会返回std::string
temp
的副本。
答案 5 :(得分:0)
foo2
返回一个指向本地变量内部的指针,该变量在离开函数时被销毁。 (那很糟糕)