問題のコード スニペットには、foo() 関数から一時的な std::string オブジェクトを返し、その後 bar( ) 一時的な c_str() ポインタを使用します。この懸念は、一時ファイルが bar() の実行前に破棄されるという仮定から生じています。
しかし、この仮定は正しくありません。 C 言語標準によれば、一時オブジェクトは、それが関与する完全な式が完了するまで存在します。この概念は、次のコード構造で説明されています。
____________________ range of full expression bar( foo().c_str() ); ^^^^^ ^ | | birth funeral
この例では、foo() によって返される一時オブジェクトの存続期間は、「誕生」というラベルが付いた時点での作成から「葬儀」での破棄まで延長されます。 。」この破棄は、最初に考えられていたように、bar() の呼び出し前ではなく、bar() の呼び出し後に発生します。
正確なルールでは、字句的に右辺値 (右側の式) を含む完全な式が含まれるときに一時オブジェクトが破棄されると規定しています。作成責任者が評価を終了します。指定されたコードでは、この完全な式は関数呼び出し自体、bar( foo().c_str() ) です。したがって、一時オブジェクトはこの呼び出しが完了するまで存在し続け、bar() がその c_str() ポインターに確実にアクセスできるようになります。
以上が一時的な C 文字列の寿命はどれくらいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。