gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:27:55 25 4
gpt4 key购买 nike

我有以下结构:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com