ホームページ >バックエンド開発 >C++ >作成関数 `foo()` が戻った後、一時文字列オブジェクトの `c_str()` ポインタが `bar()` で有効なのはなぜですか?

作成関数 `foo()` が戻った後、一時文字列オブジェクトの `c_str()` ポインタが `bar()` で有効なのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-09 07:01:07390ブラウズ

Why is the `c_str()` pointer of a temporary string object valid in `bar()` after its creating function `foo()` has returned?

foo() と bar() のオブジェクトのライフタイム

C では、関数呼び出し中に作成されたオブジェクトは一時オブジェクトとみなされます。プログラムの正しい動作を保証するには、その有効期間を理解することが重要です。

次のコードを考えてみましょう:

std::string foo() {
  std::string out = something...;
  return out;
}

void bar( const char* ccp ) {
  // do something with the string..
}

bar( foo().c_str() );

質問:

なぜ c_str( ) foo() によって返された一時オブジェクトのポインタは、foo() が指定した後でも bar() 関数内で有効です。完了しましたか?

答え:

C 標準によれば、一時オブジェクトは、その作成を含む完全な式が完了すると破棄されます。この場合、完全な式は次のとおりです。

bar( foo().c_str() );

ASCII アートでは、一時オブジェクトの有効期間は次のようになります。

____________________   full-expression ranges from 'b' to last ')'
bar( foo().c_str() );
     ^^^^^          ^
       |            |
     birth       funeral

一時オブジェクトは foo() のときに作成されます。が呼び出され (誕生)、式の実行終了後に破棄され (葬儀)、c_str() ポインタが実行中ずっと有効であることが保証されます。 bar().

以上が作成関数 `foo()` が戻った後、一時文字列オブジェクトの `c_str()` ポインタが `bar()` で有効なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。