一時文字列の整合性の維持: std::string::c_str() の探索
C の領域では、安全性と一時文字列を含むコードの有効性について懸念が生じることがよくあります。そのような質問の 1 つは、一時文字列のコンテキスト内での std::string::c_str() の使用法に関するものです。
質問:
次のコード スニペットを考えてみましょう。
void consumer(char const* p) { std::printf("'%s'", p); } std::string random_string_generator(); consumer(random_string_generator().c_str());
このジレンマは、実行後に一時 std::string オブジェクトが破壊される可能性があることに起因します。 c_str() ポインタを取得します。これは、C 標準に従って妥当性に関する懸念を引き起こしますか?
答え:
テンポラリの有効期間を理解することが重要です。 C では、テンポラリは作成直後や使用前ではなく、完全な式の終わりに破棄されます。したがって、指定されたコードでは、一時 std::string オブジェクトは、consumer() への関数呼び出しが終了するまで存続します。
std::string::c_str() 経由で取得されたポインタは、次の時点まで有効です。非 const 操作が文字列オブジェクトに対して実行されるか、文字列オブジェクトが破棄されます。文字列オブジェクトは一時的なものであり、完全な式の最後に破棄されるため、コードは確かに整形式で有効です。
歴史的脚注:
次のことが重要です。上記の動作は C 98 で標準化されたことに注意してください。それ以前は、テンポラリの有効期間はコンパイラの実装に基づいて異なりました。ただし、標準が成熟するにつれて、動作は統一的に定義され、コンパイラ間での一貫性が確保されました。
以上がC で一時文字列を使用した `std::string::c_str()` の使用は安全ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。