ホームページ >バックエンド開発 >C++ >`std::string::c_str()` ポインタはどのくらいの期間有効ですか?

`std::string::c_str()` ポインタはどのくらいの期間有効ですか?

DDD
DDDオリジナル
2024-12-12 16:38:17505ブラウズ

How Long Do `std::string::c_str()` Pointers Remain Valid?

std::string::c_str() 結果の有効期間

質問:

const char ポインターを使用するレガシー コードとインターフェイスするプログラムでは、開発者は、 std::string::c_str() 結果の有効期間。具体的には、次のコード スニペットが安全かどうかを尋ねます:

{
  std::string server = "my_server";
  std::string name = "my_name";

  Foo foo;
  foo.server = server.c_str();
  foo.name = name.c_str();

  // use Foo

  // Foo about to be destroyed (before name and server)
}

答え:

std::string::c_str() の結果の有効期間は、文字列の有効期間とその後の変更。文字列が変更または破壊された場合、結果は無効になります。したがって、将来使用するために結果を保存する場合は、結果のコピーを作成することを一般的にお勧めします。

提供されたコード スニペットでは、std::strings (サーバーと名前) が作成され、スコープ内で変更されます。コードブロック。 c_str() の結果 (foo.server および foo.name) は、これらの一時的な std::string を指します。これらはスコープの終わりに破棄されます。

ただし、文字列はスコープの外では使用されません。これにより、 use_foo() および ~Foo() で const char ポインターを引き続き使用することが技術的に安全になります。ただし、これらの関数がポインターを他の場所にコピーする可能性がある場合は、単にポインターをコピーするのではなく、真のコピーを作成する必要があります。

したがって、コード スニペットは、この特定のケースでは技術的に正しい動作を示していますが、適切なコーディング方法は次のとおりです。後で使用するために保存する必要がある場合は、c_str() の結果のコピーを作成する必要があります。

以上が`std::string::c_str()` ポインタはどのくらいの期間有効ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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