0

我正在创建一个结构,该结构在堆上具有一个 unordered_map 字段。当我使用 new 时,我可以毫无问题地添加它。但是使用 calloc 时,由于存储桶大小为 0,因此插入时出错。在调用 Reserve 后它工作正常。

那么,在结构上调用 calloc 时,unordered_map 构造函数不会运行吗?我很困惑为什么如果它在一个新的结构中,它似乎有一个非零的桶大小。除了打电话给保护区外,还有更好的方法吗?(在这种情况下我不能使用 delete,所以我需要坚持 calloc 调用)

4

3 回答 3

5

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

您不能依赖调用reserve()aftercalloc()似乎可以解决问题的事实。它没有。你的代码的行为仍然是undefined,它可以在任何时候以它喜欢的任何方式爆炸。

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

或者,您可以将字段转换为指针,calloc()struct然后用于new分配和构造unordered_map. 如果这样做,则必须手动执行delete

于 2013-04-11T07:47:06.930 回答
1

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

于 2013-04-11T07:47:39.903 回答
0

calloc不做任何事情来初始化你的对象作为对象。它基本上是给你一个指向一些用零填充的内存的指针。所以任何需要初始化的内部字段,比如你的地图,都不会得到它。您不应该将 calloc 与对象一起使用。(实际上,您可能根本不需要它。)

于 2013-04-11T07:47:53.413 回答