ホームページ >バックエンド開発 >C++ >C の一時ファイルはどのくらいの期間存続しますか?また、なぜこのコードが機能するのでしょうか?

C の一時ファイルはどのくらいの期間存続しますか?また、なぜこのコードが機能するのでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-15 04:42:11273ブラウズ

How Long Do C   Temporaries Live and Why Does This Code Work?

テンポラリの存続期間

C では、関数からの値の戻りや式の評価など、さまざまな理由でテンポラリが作成されます。一時変数の有効期間を理解することは、プログラムが正しく動作するために非常に重要です。

次のコード スニペットを考えてみましょう。

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

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

bar(foo().c_str());

このコードでは、foo() によって作成された一時文字列は、 bar() への呼び出し内の const char* ポインター。なぜこのコードが有効なのかという疑問が生じます。

その答えは、一時コードの有効期間にあります。 C 標準によれば、一時オブジェクトは、オブジェクトを作成した右辺値を字句的に含む完全な式が完全に評価されたときに破棄されます。

上記のコードでは、完全な式は bar(foo().c_str) です。 ())。この式の評価は ' (開き括弧) で始まり、最後の ')' (閉じ括弧) で終了します。この式内では、foo() を評価することによって一時文字列が作成され、その一時文字列に対して c_str() メソッドが呼び出されます。

したがって、一時文字列は完全な式の先頭に存在し、この式は、bar() の呼び出し後、式が完全に評価されたときに破棄されます。これは、bar() の const char* ポインタがまだ有効な文字列を参照している理由を説明しています。

要約すると、foo() によって返される一時関数は、それを含む完全な式が評価された後にのみ破棄され、次のことが保証されます。 foo().c_str() によって返されるポインタは、bar().

の呼び出し全体を通じて有効なままです。

以上がC の一時ファイルはどのくらいの期間存続しますか?また、なぜこのコードが機能するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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