连接字符串文字上的 c_str() 是不是安全?

Posted

技术标签:

【中文标题】连接字符串文字上的 c_str() 是不是安全?【英文标题】: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 的生命周期无论如何都会在 结束,所以在您的示例中基本上是相同的问题。 【参考方案1】:

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

【讨论】:

以上是关于连接字符串文字上的 c_str() 是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

连接字符文字('x')与单个字符字符串文字(“x”)

目前是不是有将两个或多个字符串文字类型连接到 TypeScript 中的单个字符串文字类型?

当字符串保存在集合中时,c_str() 是不是仍然有效

由于 BoringSSL 证书验证失败,iOS 上的安全 websocket 连接失败

Ubuntu remmina无法连接到RDP服务器

(基本知识)Redis连接与安全