从函数返回值时使用c_str()的差异

Nob*_*lis 2 c++ string

如果我有以下两个功能

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函数的返回值它真的会重要吗?

bil*_*llz 8

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)


Luc*_*ore 6

const char* foo2()
{
    std::string temp;
    ...
    return temp.c_str();
}
Run Code Online (Sandbox Code Playgroud)

根本不安全,因为它temp会被破坏,所以你将返回一个悬垂的指针.