我是一名C#开发人员,当我在C ++中运行以下代码时,我感到很奇怪:
std::string original = "Hello";
std::string st = original + "World";
const char *c = st.c_str();
const char *c2 = (original + "World").c_str();
std::cout << "c = '" << c << "'" << std::endl;
std::cout << "c2 = '" << c2 << "'" << std::endl;
我得到以下输出:
c = 'HelloWorld'
c2 = ''
在C#中,类似的构造将导致c
和c2
具有相同的值(&#34; Hello World&#34;)。我的猜测是(original + "World")
的结果范围在右)
结束,因此在无效输入上调用c_str()
。那是对的吗?除了创建变量以保存临时结果之外,还有更好的方法来实现这一目标吗?
谢谢!
答案 0 :(得分:4)
我的猜测是(原始+“世界”)结果的范围在右边结束),因此在无效输入上调用c_str()。这是对的吗?
不完全,但很接近。 c_str()
本身很好,但是在语句结束后该指针变为无效,因此之后使用c2
会导致UB。
除了创建变量以保存临时结果之外,还有更好的方法来实现这一目标吗?
您可以将其分配给const引用:
const std::string &ref = original + "World";
const char *c2 = ref.c_str();
但我认为没有比创建变量更好的了。
答案 1 :(得分:2)
&#39; C2&#39;这里初始化为指向临时对象的指针,该对象不再存在于分号中。因此,这是未定义的行为。您需要使用中间变量:
const auto temp(original + "World");
const char* c2 = temp.c_str();