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

时间:2013-02-07 10:28:56

标签: c++ string

如果我有以下两个功能

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

6 个答案:

答案 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返回一个指向本地变量内部的指针,该变量在离开函数时被销毁。 (那很糟糕)