2

次の2つの機能がある場合

std::string foo1()
{
    std::string temp;
    ...
    return temp;
}

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

constchar*を入力として受け取る関数。

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()安全ではありませんconst char*。関数が戻るときにガベージを指すローカル変数にを返します。

foo1オブジェクトを返すには、C++で安全で慣用的な方法であるwhichを使用するだけです。NRVOがキックインする可能性があります。これにより、戻ったときにtempのコピーが削除されfoo1ます。

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

bar(foo2()); foo2が戻ると、temp 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 tempfoo2foo1std::string temp

于 2013-02-07T10:33:57.367 に答える
0

foo2関数を終了するときに破棄されるローカル変数の内部へのポインターを返します。(それは良くないね)

于 2013-02-07T10:32:21.673 に答える