【发布时间】:2017-11-09 13:50:39
【问题描述】:
我有以下结构:
struct MyNewShinyStruct
{
int index;
std::string name;
};
当calloc上面的结构然后给name赋值时:
char letters[128]{"ABCDEFG"};
auto temp = static_cast<MyNewShinyStruct*>(calloc(2, sizeof(MyNewShinyStruct)));
temp[0].name = letters;
我应该为上述问题遇到麻烦:-)(我应该使用new 运算符)。 'calloc' 将分配的内存清零,并且不调用 struct/std::sting 的构造函数。但是,由于某些未知原因,上述代码在 VS2010/2013/2015 中有效,仅在 VS2017 中失败。它应该总是失败!请问我错过了什么?
附: 上面的代码已经投入生产(使用 VS2010 编译)多年,甚至没有一次报告与此代码有关的错误,甚至一次都没有。它总是有效的。
【问题讨论】:
-
calloc单独创建非 pod 类型是不够的。std::string不是 pod,通过扩展,MyNewShinyStruct也不是。结果是未定义的行为,无法进行有意义的推理。 -
未定义的行为并不意味着总是失败。有时它似乎也有效。
-
它是 C++,使用 std::vector!
-
您在演示中遗漏的部分是在分配该字符串后打印该字符串的内容。在 Visual Studio 2017 中,它会导致垃圾。
-
它真的总是有效运气不好。现在开始修复它。
标签: c++ visual-studio memory-management visual-studio-2017 undefined-behavior