C で一時文字列を使用した `std::string::c_str()` の使用は安全ですか?

Mary-Kate Olsen
リリース: 2024-11-13 14:09:02
オリジナル
875 人が閲覧しました

Is Using `std::string::c_str()` with a Temporary String Safe in C  ?

一時文字列の整合性の維持: 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート