2

このコードを VS2010 で実行すると、次のような警告が表示されますが、コンソールに C 文字列 "f()" と "g()" が出力されます。

質問 1: f() では警告が生成され、g() では生成されないのはなぜですか? プログラムが終了するまで、文字列リテラルは静的メモリに保持されませんか?

質問 2: main() で h() の呼び出しをコメント アウトすると、コードがクラッシュします。なぜ異なる動作ですか?

#include<iostream>

const char* const& f()
{
   return "f()";            //  warning C4172: returning address of local variable or temporary
}

const char* g()
{
    return "g()";           //  no warning
}

const std::string& h()
{
    return "h()";           //  warning C4172:
}

int main()
{
    std::cout << f() << '\n';
    std::cout << g() << '\n';
//  std::cout << h().c_str() << '\n';       //  comment out and program crashes
}
4

2 に答える 2

3

ローカルでのみ使用する値への参照を返しています。これは未定義の動作です。おそらく必要なのはstd::string、char ポインター参照または ではなく、単に char ポインターまたは を返すことstd::string&です。

たまたまf()印刷されたものを目にしたという事実は、抽選の運にすぎません。これはまだ未定義の動作であり、期待できません。

于 2013-03-17T18:18:42.343 に答える
2

f() は未定義の動作を生成します。未定義の動作により、プログラムが無効な状態になり、(疑似ランダム) クラッシュが発生します。

ローカル変数への参照を返すため、これは未定義の動作です。関数呼び出しの後、ローカル変数は破棄され、char*ポイントはどこにもありません。

参照を削除すると、値がコピーされ、スコープ違反はなくなります。

于 2013-03-17T18:19:44.897 に答える