2013-04-11 61 views
0

我正在创建一个结构体,该结构体的堆上有一个unordered_map字段。当我使用新的,我可以添加到它没有问题。但是使用calloc时,由于存储区大小为0,所以我插入了一个错误。在我调用reserve后,它正常工作。calloc(),malloc()vs新建一个内部具有unordered_map的结构体

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

+0

为什么你不得不使用calloc? – Pubby 2013-04-11 07:46:41

+0

这是传统代码。我只是添加一个新的领域,它恰好是一个无序的地图。 – jamesatha 2013-04-11 07:47:31

+0

够公平的。我想这意味着你不能使用新的位置? – Pubby 2013-04-11 07:49:20

回答

5

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

您不能依赖在calloc()似乎解决问题后拨打reserve()的事实。它没有。你的代码的行为仍然是undefined,它可以随时以任何方式炸毁它。

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

或者,您可以将该字段变为指针calloc()struct,然后使用new分配和构造unordered_map。如果你这样做,你将不得不手动delete它。

1

C内存分配函数通常不会调用构造函数。请参阅malloc vs new。第一个答案总结得非常好:不要在C++中使用malloc

+0

通常?他们将永远不会调用构造函数。 (好吧,'char'可能是唯一的例外) – Pubby 2013-04-11 07:48:35

+0

由于我不可能知道每个实现的行为,所以我坚持通常。 – 2013-04-11 07:50:12

0

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