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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-11 11:42:02358ブラウズ

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

一時文字列で std::string::c_str() を使用しても安全ですか?

C では、 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 オブジェクトで std::string::c_str() を呼び出すと、string オブジェクトの破棄が差し迫っているように見えるため、この懸念が生じます。

ただし、C 11 標準によれば、std::string::c_str() によって取得されるポインタは、文字列によって管理されるメモリを参照します。

  • 文字列オブジェクトで非定数メンバー関数が呼び出される。
  • 文字列オブジェクトが破棄される。

> 提供されたコード スニペットでは、一時文字列オブジェクトは完全な式の終了時 (つまり、consumer() の呼び出し後) に破棄されます。したがって、std::string::c_str() を介して取得されたポインタは Consumer() の呼び出し中ずっと有効であるため、コードは安全であると考えられます。

一時オブジェクトの有効期間は C 98 以降明確に定義されています。コンパイラによって異なる以前のバージョンの C とは異なります。その結果、以前のバージョンでは安全でなかったコードが、最新の C コンパイラでは安全であるとみなされるようになりました。

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

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