2

如果我有以下两个功能

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

4

6 回答 6

8
const char* foo2()
{
    std::string temp;
    ...
    return temp.c_str();
}

foo2()是不安全的,您将 a 返回const char*到一个局部变量,该变量将在函数返回时指向垃圾。

只需使用foo1which 在 C++ 中是一种安全且惯用的方式来返回一个对象。NRVOfoo1可能会启动,它会在返回时删除 temp 的副本。

std::string foo1()
{
    std::string temp;
    ...
    return temp;
}
于 2013-02-07T10:32:02.553 回答
6
const char* foo2()
{
    std::string temp;
    ...
    return temp.c_str();
}

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

于 2013-02-07T10:32:02.547 回答
2

酒吧(foo2());完全是错误的......因为当 foo2 返回时,临时 std::string 被破坏并且 c_str() 返回的指针现在指向无效位置。

于 2013-02-07T10:32:45.907 回答
2

只要原始字符串对象不被破坏,c_str 的字符数组就有效。以前有人问过这个问题。. 在你的函数结束时,temp被销毁,这意味着foo2()返回一个无效的指针。

于 2013-02-07T10:32:55.057 回答
1

foo2版本是不安全的,因为返回的指针c_str()无效,因为std::string tempfoo2. foo1更安全,因为它返回std::string temp.

于 2013-02-07T10:33:57.367 回答
0

foo2返回一个指向局部变量内部的指针,该变量在退出函数时被销毁。(那很糟)

于 2013-02-07T10:32:21.673 回答