c++ - 使用 (str1 + str2).c_str() 是否安全?

标签 c++ string

我已经测试过这段代码:

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;

int main()
{
    string s1("a"),s2("b");
    const char * s = (s1+s2).c_str();
    printf("%s\n",s);
}

它返回“ab”。

据我所知,由于 (s1 +s2) 是一个临时对象,可能会以某种方式消失(我不知道),那么 const char * s 可能指向未定义的内存并可能被转储。

那么像这样使用 .c_str() 安全吗?

最佳答案

在您的示例中不安全。但是在

中是安全的
printf("%s\n", (a + b).c_str());

原因是临时值(如 a + b 的结果)在完整表达式的末尾被销毁。在您的示例中, const char * 在包含临时和取消引用的完整表达式中幸存下来是未定义的行为。

“未定义的行为”最糟糕的部分是事情可能无论如何都可以正常工作......(只有当你在包括你 parent 在内的大量观众面前制作演示时,UB 代码才会崩溃;-))

关于c++ - 使用 (str1 + str2).c_str() 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18146267/

相关文章:

c++ - 将保存二进制的字符串转换为 float

C++ 多行 #if

c++ - 为什么它在这里使用 void** ?

javascript - JavaScript 中从字符串获取函数

c# - 将对象转换为 CSV 字符串

java - 在 Java 中删除标点符号前的空格

c++ - 我什么时候应该 std::forward 一个函数调用?

c++ - 尝试使用函数计算剩余球员的球队数量

c++ - getline 的替代品

c - 以空格为分隔符的字符串三角形C语言