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 サイトの他の関連記事を参照してください。