Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ calloc vs new适用于各种编译器中的复杂结构_C++_Visual Studio_Memory Management_Visual Studio 2017_Undefined Behavior - Fatal编程技术网

C++ calloc vs new适用于各种编译器中的复杂结构

C++ calloc vs new适用于各种编译器中的复杂结构,c++,visual-studio,memory-management,visual-studio-2017,undefined-behavior,C++,Visual Studio,Memory Management,Visual Studio 2017,Undefined Behavior,我有以下结构: 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; char字母

我有以下结构:

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;
char字母[128]{“ABCDEFG”};
auto temp=static_cast(calloc(2,sizeof(mynewshinysttruct));
临时[0]。名称=字母;
我应该会因为上述问题而遇到麻烦:-)(我应该使用
new
操作符)calloc`将分配的内存归零,不调用struct/std::sting的构造函数。但是,由于一些未知的原因,上述代码在VS2010/2013/2015中工作,但仅在VS2017中失败。它应该永远失败!请问我错过了什么

附言。 上面的代码已经在生产中(使用VS2010编译)很多年了,甚至没有一次报告与此代码有关的bug,甚至没有一次。它总是有效的

它应该永远失败!请问我错过了什么


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

calloc
单独创建非pod类型是不够的
std::string
不是pod,扩展后也不是
mynewshinystuct
。结果是未定义的行为,无法进行有意义的推理。未定义的行为并不意味着总是失败。有时它也可以工作。它是C++,使用STD::向量!您在演示中遗漏的部分是在分配字符串后打印该字符串的内容。在Visual Studio 2017中,它会导致出现错误,因为您的错误是绝对正确的。我将使用通常的参数:
它的遗留代码:-)
.1。我们的
UB
?@refealsheinker未定义的行为。
要修复程序,请在calloc返回的内存中使用placement new(新位置)
——这是一个选项。但是我可能会用
new
完全替换
calloc
,并完成它,@refalsheinker您最好使用
std::vector
,或者至少使用
new
@Slava智能指针您完全正确。我将使用通常的参数:
它的遗留代码:-)