Calloc (), malloc() vs新建一个内部有unordered_map的结构体

calloc(), malloc() vs new-ing a struct that has an unordered_map inside

本文关键字:unordered 结构体 内部 map malloc vs 新建 Calloc 一个      更新时间:2023-10-16

我正在创建一个结构体,该结构体的字段是堆上的unordered_map。当我使用new时,我可以毫无问题地添加。但是使用callloc时,插入时会出错,因为桶的大小是0。我打预备队电话就行了。

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

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

你不能依赖这样一个事实,即在calloc()之后调用reserve()似乎可以解决问题。它不是。你的代码的行为仍然是未定义的,它可以在任何时候以任何方式爆炸。

解决这个问题的一个方法是使用位置new来调用unordered_map的构造函数。

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

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

calloc不会将对象初始化为对象。它基本上是给你一个指针指向一些满是0的内存。任何需要初始化的内部字段,比如map,都不会得到它。你不应该将calloc与对象结合使用。(实际上,您可能根本不需要它)