我有以下结构:
struct MyNewShinyStruct
{
int index;
std::string name;
};
当调用
上面的结构然后给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 编译)多年,甚至没有一次报告过与此代码有关的错误,一次也没有。它总是有效。
最佳答案
It should always fail! What am I missing please?
您忽略了 UB 并不意味着“总是失败”这一事实。它可以是任何东西,包括预期的行为。要修复您的程序,请在 calloc 返回的内存上使用 placement new(假设您出于任何原因必须使用 calloc,如果您不使用 std::vector
代替)。您还应该了解 std::string
很可能会自行分配内存,除非您提供自定义分配器,否则不太可能调用。
关于c++ - calloc vs new 用于各种编译器中的复杂结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47203580/