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 サイトの他の関連記事を参照してください。