如果我有以下两个功能
std::string foo1()
{
std::string temp;
...
return temp;
}
Run Code Online (Sandbox Code Playgroud)
和
const char* foo2()
{
std::string temp;
...
return temp.c_str();
}
Run Code Online (Sandbox Code Playgroud)
以及一个以const char*作为输入的函数;
void bar(const char* input) { ... }
Run Code Online (Sandbox Code Playgroud)
哪一个更安全:
bar(foo1().c_str());
Run Code Online (Sandbox Code Playgroud)
要么
bar(foo2());
Run Code Online (Sandbox Code Playgroud)
如果我想做的就是将一个字符串作为输入传递给bar,然后不关心任何一个foo函数的返回值它真的会重要吗?
const char* foo2()
{
std::string temp;
...
return temp.c_str();
}
Run Code Online (Sandbox Code Playgroud)
foo2()是不安全的,你返回一个const char*局部变量,当函数返回时将指向垃圾.
只需foo1在C++中使用哪种安全且惯用的方式来返回对象.NRVO可能会启动,这会在foo1返回时忽略临时副本.
std::string foo1()
{
std::string temp;
...
return temp;
}
Run Code Online (Sandbox Code Playgroud)
const char* foo2()
{
std::string temp;
...
return temp.c_str();
}
Run Code Online (Sandbox Code Playgroud)
根本不安全,因为它temp会被破坏,所以你将返回一个悬垂的指针.
| 归档时间: |
|
| 查看次数: |
971 次 |
| 最近记录: |