如何返回 std::string.c_str()

新手上路,请多包涵

我有一个返回常量 char 指针的方法。它使用 std::string 并最终返回其 c_str() 字符指针。

 const char * returnCharPtr()
{
    std::string someString;

    // some processing!.

    return someString.c_str();
}

我从 COVERITY 工具得到了一份报告,上面的用法不是很好。我用谷歌搜索并发现返回的 char 指针将在 someString 遇到其破坏后立即失效。

鉴于此,如何解决此问题?如何准确返回char指针?

返回 std::string 将解决此问题。但我想知道是否有其他方法可以做到这一点。

原文由 user3210526 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
1 个回答

这段代码中发生的事情是:

 const char * returnCharPtr()
{
    std::string someString("something");
    return someString.c_str();
}

  1. std::string 的实例被创建 - 它是一个具有自动存储持续时间的对象
  2. 返回指向该字符串内部存储器的指针
  3. 对象 someString 被破坏,其内部内存被清理
  4. 此函数的调用者接收到产生 未定义行为 的 _悬空指针_(无效指针)

最好的解决方案是 _返回一个对象_:

 std::string returnString()
{
    std::string someString("something");
    return someString;
}

调用你的函数时, 要这样做:

 const char *returnedString = returnString().c_str();

因为 returnedString 在返回的 std::string 被破坏后仍然会悬空。而是存储整个 std::string

 std::string returnedString = returnString();
// ... use returnedString.c_str() later ...

原文由 LihO 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题