ホームページ  >  記事  >  バックエンド開発  >  C の一時文字列で `std::string::c_str()` を使用するのは安全ですか?

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-06 17:51:02810ブラウズ

Is it Safe to Use `std::string::c_str()` with Temporary Strings in C  ?

一時文字列で std::string::c_str() を使用する場合の潜在的な落とし穴

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

void consumer(char const* p) { std::printf("%s", p); }

std::string random_string_generator();

consumer(random_string_generator().c_str());

このコードは、C 標準に従って整形式であるかどうかという疑問を引き起こします。

この懸念は、random_string_generator() が一時的な std::string オブジェクトを返すという事実から生じています。次に、 c_str() ポインターを取得します。これにより、ポインターが使用される前に、一時的な std::string オブジェクトが破壊されやすい状態になる可能性があります。

その影響を理解するには、C の一時オブジェクトの有効期間を詳しく調べる必要があります。

C 標準によれば、一時関数の有効期間は、それが作成された完全な式が終了するまで延長されます。この場合、完全な式はコンシューマーへの呼び出しです。したがって、一時的な std::string オブジェクトは、コンシューマ関数の実行が終了するまで破棄されません。

したがって、取得した c_str() ポインタは、コンシューマへの呼び出し全体を通じて有効なままとなり、コードが適切になります。

この保証は完全な式の存続期間中のみ有効であることに注意することが重要です。 c_str() ポインタがこのコンテキストの外で保存および使用される場合、一時的な std::string オブジェクトがすでに破棄されている可能性があるため、動作は未定義になります。

以上がC の一時文字列で `std::string::c_str()` を使用するのは安全ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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