我正在创建一个结构,其中的字段是堆上的unordered_map。当我使用new时,我可以毫无问题地添加它。但是使用calloc,我得到一个插入错误,因为桶大小为0.我调用reserve后工作正常。
因此,当在结构上调用calloc时,unordered_map构造函数是否不运行?我很困惑为什么如果它在一个新版本的结构中,它似乎具有非零桶大小。除了召唤预备队之外,还有更好的方法吗? (在这种情况下我不能使用删除,所以我需要坚持使用calloc调用)
答案 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与对象结合使用。(的确,你可能根本就不需要它。)