【问题标题】:Is c_str() on a concatenated string literal safe?连接字符串文字上的 c_str() 是否安全?
【发布时间】:2016-01-19 09:46:47
【问题描述】:

我从this answer 知道字符串文字是静态分配的。但是下面的字符串连接也可以安全使用吗?

void someFunction(std::string& foo) {
    functionTakingCString(("start " + foo + " end").c_str());
}

后续问题:如 cmets 中所述,当 functionTakingCString 存储该指针时,这确实是不安全的。在这种情况下,以下内容是否有效:

void someFunction(std::string& foo) {
    std::string bar = "start " + foo + " end";
    functionTakingCString(bar.c_str());
}

【问题讨论】:

  • 只要functionTakingCString 不存储该指针,并且在临时std::string 的生命周期之外尝试使用它。
  • 感谢您的评论 - 我添加了关于您的建议的后续问题
  • bars 的生命周期无论如何都会在} 结束,所以在您的示例中基本上是相同的问题。

标签: c++ string std c-strings


【解决方案1】:

仅在functionTakingCString(("start " + foo + " end").c_str()); 运行时分配连接的字符串。然后内存被释放,并且该指针不再安全使用,因为您可以阅读here。如果将该指针传递给在functionTakingCString 退出后运行的任何内容,那么您将遇到麻烦。

【讨论】:

    猜你喜欢
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多