c++ - 为什么不同编译器使用c++字符串+字符串临时对象会有区别?

标签 c++ string temporary-objects

<分区>

请看这段代码。

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

int main() {
    string hello = "Hello"
         , world = "World";

    const char *p = (hello+world).c_str();
    cout << "STRING: " << p <<endl;

    return 0;
}

我没有声誉,无法发布图片,因此我将手写结果。

= Visual Studio 2013 ver.12.0.30110.00

STRING: 

= Dev-C++ ver.4.9.9.2

STRING: HelloWorld

下面首先是Visual Studio编译后的执行结果。

其次是用Dev-C++编译的。

我想知道是什么造成了这种差异。

期待您的回复。谢谢:)

最佳答案

(hello+world).c_str() 仅在尾随 ; 之前有效。之后访问内存是未定义的行为。

Visual Studio 可能实际上会清除内存,Dev-C++ 不会打扰。尝试使用 Visual Studio(优化)构建发布版本,您可能会看到相同的行为。

关于c++ - 为什么不同编译器使用c++字符串+字符串临时对象会有区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23287894/

相关文章:

c++ - 为什么我得到以下输出?

c - malloc ** 和 * 之间有区别吗

java - 在java中使用正则表达式删除匹配的字符串

mysql - 将 MySQL 表更新为构造的双聚合,这取决于表本身

c++ - 临时对象: automatic,线程的存储时长是多少,是静态的还是动态的?

c++ - 抛出临时值作为引用未定义的行为吗?

c++ - 为什么当我改变它的位置时光源没有移动?

c++ - 为什么 C++ 标准使正则表达式算法成为自由函数?

c++ - 如何在 QTapAndHoldGesture 之后忽略 QTapGesture

regex - Python 3如何使用正则表达式在两点之间获取字符串?