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

标签 c++ visual-studio memory-management visual-studio-2017 undefined-behavior

我有以下结构:

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/

相关文章:

C++,预处理器语句

c++ - #import 等效命令行

java - 不使用 StringBuffer 可能导致内存泄漏?

sqlite sqlite3_close()不会释放获取的内存

c++ - 我想在我的程序结束后存储一个值

c++ - Catch动态传递参数给测试用例

c++ - 为 C++ Windows 服务动态创建安装程序

visual-studio - Angular 2 beta 13 with Visual Studio 2015 update 2/编译保存

asp.net-mvc - 将项目添加到 Visual Studio 上下文菜单

java - 如何获取 ConcurrentHashMap 的最新 View ?