calloc(),malloc()vs new-ing一个内部有unordered_map的结构

时间:2013-04-11 07:45:03

标签: c++ memory-management malloc calloc

我正在创建一个结构,其中的字段是堆上的unordered_map。当我使用new时,我可以毫无问题地添加它。但是使用calloc,我得到一个插入错误,因为桶大小为0.我调用reserve后工作正常。

因此,当在结构上调用calloc时,unordered_map构造函数是否不运行?我很困惑为什么如果它在一个新版本的结构中,它似乎具有非零桶大小。除了召唤预备队之外,还有更好的方法吗? (在这种情况下我不能使用删除,所以我需要坚持使用calloc调用)

3 个答案:

答案 0 :(得分:5)

你是对的,malloc()等不运行构造函数,而new则运行构造函数。

您不能依赖在reserve()之后调用calloc()来解决问题的事实。它没有。您的代码行为仍然是undefined,它可能随时以任何方式爆炸。

解决问题的一种方法是使用placement new来调用unordered_map的构造函数。

或者,您可以将字段变为指针calloc() struct,然后使用new分配和构建unordered_map。如果您这样做,则必须手动delete

答案 1 :(得分:1)

C内存分配函数通常不会调用构造函数。见malloc vs new。第一个答案很好地总结了它:在C ++中使用malloc

答案 2 :(得分:0)

calloc无法初始化对象的对象。它基本上是指向一个充满零的内存的指针。因此,任何需要初始化的内部字段(如地图)都不会得到它。 你不应该将calloc与对象结合使用。(的确,你可能根本就不需要它。)