我正在创建一个结构,它的一个字段是堆上的一个unordered_map。当我使用new时,我可以毫无问题地添加它。但是使用calloc时,因为存储桶大小为0,所以插入时出错。在我调用保留后,它工作正常。
那么,当在结构上调用calloc时,unordered_map构造函数不会运行吗?我搞不懂为什么如果它在一个新版本的结构中,它似乎有一个非零的存储桶大小。除了打电话给预备队之外,还有更好的方法吗?(在这种情况下我不能使用delete,所以我需要坚持使用calloc调用)
发布于 2013-04-11 15:47:07
你是对的,malloc()等人不运行构造函数,而new运行构造函数。
您不能相信在calloc()之后调用reserve()似乎就能解决这个问题。你的代码的行为仍然是undefined的,它可能在任何时刻以任何它喜欢的方式爆炸。
解决这个问题的一种方法是使用placement new来调用unordered_map的构造函数。
或者,您可以将字段转换为指针,对struct执行calloc()操作,然后使用new来分配和构造unordered_map。如果你这样做,你将不得不手动delete它。
发布于 2013-04-11 15:47:40
内存分配函数通常不会调用构造函数。参见malloc vs new。第一个答案很好地总结了这个问题:不要在C++中使用malloc。
发布于 2013-04-11 15:47:53
calloc不会将您的对象初始化为对象。它基本上是给你一个指针,指向一些充满零的内存。因此,任何需要初始化的内部字段,比如您的map,都不会得到它。你不应该和objects一起使用(实际上,你可能根本不需要它)。
https://stackoverflow.com/questions/15943278
复制相似问题