1. ホーム
  2. c++

[解決済み] std::string::c_str() の結果のライフタイムはどのくらいですか?

2022-11-20 18:40:17

質問

私のプログラムの中で、あるレガシーコードとインターフェイスする必要があります。 const char* .

のような構造を持っているとします。

struct Foo
{
  const char* server;
  const char* name;
};

私の上位のアプリケーションでは std::string を使うことを考えました。 std::string::c_str() を使って const char* のポインタを返します。

しかし、その寿命は c_str() ?

未定義の動作に直面することなく、このようなことを行うことは可能ですか?

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

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

  // We use foo
  use_foo(foo);

  // Foo is about to be destroyed, before name and server
}

の結果をすぐにコピーすればいいのでしょうか? c_str() の結果を別の場所にコピーすればよいのでしょうか?

ありがとうございます。

どのように解決するのですか?

この c_str() の結果は、もし std::string が破壊されたり、文字列の非恒等式メンバ関数が呼ばれたりすると 無効になります。 そのため、通常は、それを残しておく必要がある場合は、そのコピーを作成することになります。

あなたの例の場合、どうやら結果は c_str() の結果は、そのスコープにいる間は文字列が変更されないので、安全に使用されるようです。 (しかし、私たちは use_foo() または ~Foo() がこれらの値に対して行っているかもしれません。もし、文字列を別の場所にコピーするのであれば、真の コピー を行うべきで、単に char のポインターをコピーするのではありません)。