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() 结果以供以后使用,则需要复制 c_str() 结果。
以上是`std::string::c_str()` 指针保持有效多久?的详细内容。更多信息请关注PHP中文网其他相关文章!