calloc vs new for各种编译器中的复杂结构

Ref*_*ker 2 c++ memory-management undefined-behavior visual-studio visual-studio-2017

我有以下结构:

struct MyNewShinyStruct
{
    int index;
    std::string name;
};
Run Code Online (Sandbox Code Playgroud)

calloc进入上面的结构然后将值赋给name:

char letters[128]{"ABCDEFG"};
auto temp = static_cast<MyNewShinyStruct*>(calloc(2, sizeof(MyNewShinyStruct)));
temp[0].name = letters;
Run Code Online (Sandbox Code Playgroud)

我应该在上面遇到麻烦:-)(我应该使用new运算符).'calloc`将已分配的内存清零,并且不调用struct/std :: sting的构造函数.但是,由于某些未知原因,上述代码在VS2010/2013/2015中的工作仅在VS2017中失败.应该总是失败!我错过了什么?

PS上面的代码已经生产(使用VS2010编译)多年,甚至没有报告过与此代码有关的错误,甚至没有一次.它总是奏效.

Sla*_*ica 5

应该总是失败!我错过了什么?

你错过了UB并不意味着"总是失败"的事实.它可以是任何东西,包括预期的行为.要修复你的程序,请在calloc返回的内存中使用placement new(假设你必须使用calloc,无论出于何种原因,如果你不使用它std::vector).您还应该了解,std::string很可能会自行分配内存,除非您提供自定义分配器,否则它不太可能是calloc.