Visual Studio 2019 无法正确处理动态结构数组的聚合初始化

Posted

技术标签:

【中文标题】Visual Studio 2019 无法正确处理动态结构数组的聚合初始化【英文标题】:Visual Studio 2019 does not handle aggregate initialization of dynamic array of structs correctly 【发布时间】:2020-01-07 05:57:45 【问题描述】:

如果使用 VC++ 2017 编译,下面的代码会打印垃圾(或零),如果使用 GCC 或 Clang (https://rextester.com/JEV81255) 编译,则会打印“1122”。是 VC++ 的错误还是我在这里遗漏了什么?

#include <iostream>

struct Item 
    int id;
    int type;
;

int main()

    auto items = new Item[2]
    
         1, 1 ,
         2, 2 
    ;

    std::cout << items[0].id << items[0].type;
    std::cout << items[1].id << items[1].type;

同时,如果元素是原始类型(如int),它也可以工作。

【问题讨论】:

是的,已经坏了好几年了。 里面的东西完全被忽略了,所以你可以写一些像 auto items = new Item[2] std::cout, " sdf" , 0.3f ; 这样的废话。我试图在 VS 反馈中心(至少是我创建的那个)上找到相关问题,但那里的搜索也被破坏了...... 跟进@VTT 评论仍然很破碎,直播:godbolt.org/z/Fn6dgp @rafix07 在 VS2019 中还是坏掉了 VS2019 代码分析给出:warning C6001: Using uninitialized memory 'items[0].id'。但是 VS2019 中的 clang-cl 工作正常。 这太可怕了。而 MS 没有解决这个问题的事实更加可怕...... 【参考方案1】:

我通过编写以下代码让它工作,但是数据没有存储在堆上。

Item items[] 
     1, 1 ,
     2, 2 
;

如果您在堆上需要它,请使用下面的解决方案,它似乎可以与 vc++ 编译器一起使用。 (请注意,这只是一种解决方法,并不能解决根本问题):

Item* Items[2];
Items[0] = new Item3,3;
Items[1] = new Item4,4;

std::cout << (*Items[0]).id << (*Items[0]).type << std::endl;
std::cout << (*Items[1]).id << (*Items[1]).type << std::endl;

或者,您可以使用第一个选项创建数组,然后将其复制到堆上的数组中,如下所示:

Item items[2]
    1,1,
    2,2
;

Item* hitem = new Item[2];
for(int i = 0; i < 2; i++)
    hitem[i].id = items[i].id + 4;
    hitem[i].type = items[i].type + 4;

虽然这很慢,但它的工作方式就像在 vc++ 编译器上一样。 你可以在这里查看整个代码:https://rextester.com/VNJM26393

我不知道为什么它只能这样工作......

【讨论】:

以上是关于Visual Studio 2019 无法正确处理动态结构数组的聚合初始化的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2019 更新中断发布(不正确的 TLS 版本)

无法在 Visual Studio 2012 中正确查看属性窗口

在 Visual Studio 2019 中处理异常

Visual Studio 2019 无法识别从 GitHub 提取的新文件

Visual Studio 2019 - SSDT

Visual Studio 2019 git 问题:“无法生成 ... ssh.exe:没有这样的文件或目录”在 fetch/push 上