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 无法识别从 GitHub 提取的新文件
Visual Studio 2019 git 问题:“无法生成 ... ssh.exe:没有这样的文件或目录”在 fetch/push 上