在不同版本的gcc上有不同的结果

Wei*_*ong 5 c++

比较两个代码如下:

  1 #include <new>
  2 #include <cstdio>
  3 class CA
  4 {
  5 public:
  6     int i, j, k;
  7 };  
  8 
  9 int main()
 10 {
 11     int aa[4] = { 1, 2, 3, 4 };
 12     CA *i = new(aa) CA();
 13     printf("%d %d %d %d\n", aa[0], aa[1], aa[2], aa[3]);
 14     return 0;
 15 }   

  1 #include <new>
  2 #include <cstdio>
  3 class CA
  4 {
  5 public:
  6     int i, j, k;
  7 };  
  8 
  9 int main()
 10 {
 11     int aa[4] = { 1, 2, 3, 4 };
 12     CA *i = new(aa) CA;
 13     printf("%d %d %d %d\n", aa[0], aa[1], aa[2], aa[3]);
 14     return 0;
 15 }   
Run Code Online (Sandbox Code Playgroud)

第12行的差异.在gcc4.1.2的环境中,这两个代码将得到相同的结果1 2 3 4但是在gcc4.4和gcc4.5中,第一个代码将得到0 0 0 4

为什么?

sha*_*oth 2

首先,不同版本的GCC具有不同程度的标准遵从性。

在这种情况下,后面的版本“更正确”——值初始化必须在第一个片段中进行(因为您隐式调用具有 POD 成员变量的类的默认编译器生成的构造函数),这将导致类 CA 的成员变量初始化到零。请参阅用户 Michael Burr非常详细的回答以及对密切相关问题的回答