我有以下结构:
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
运算符)。 &#39; calloc`将已分配的内存清零,并且不调用struct / std :: sting的构造函数。但是,由于某些未知原因,上述代码在VS2010 / 2013/2015中的工作仅在VS2017中失败。应该总是失败!我错过了什么?
P.S。 以上代码已经生产(使用VS2010编译)多年,甚至没有报告过与此代码有关的错误,甚至没有一次。它总是奏效。
答案 0 :(得分:5)
应该总是失败!我错过了什么?
你错过了UB并不意味着“总是失败”的事实。它可以是任何东西,包括预期的行为。要修复你的程序,请在calloc返回的内存中使用placement new(假设你必须使用calloc,无论出于何种原因,如果你不使用std::vector
)。您还应该了解std::string
最有可能自己分配内存,除非您提供自定义分配器,否则它不太可能是calloc。