C++ calloc(),malloc()与新建一个内部有无序映射的结构

C++ calloc(),malloc()与新建一个内部有无序映射的结构,c++,memory-management,malloc,calloc,C++,Memory Management,Malloc,Calloc,我正在创建一个结构,其中有一个字段是堆上的无序_映射。当我使用新的,我可以添加到它没有问题。但是使用calloc时,由于bucket大小为0,因此插入时会出错。在我打电话给预备队后,效果很好 那么,在结构上调用calloc时,无序的_映射构造函数是否不运行?我很困惑,为什么如果它是在一个新编辑的结构中,它似乎有一个非零的桶大小。除了给保护区打电话,还有更好的办法吗?(在这种情况下,我不能使用delete,所以我需要继续使用calloc调用)您是正确的,malloc()等不运行构造函数,而new运

我正在创建一个结构,其中有一个字段是堆上的无序_映射。当我使用新的,我可以添加到它没有问题。但是使用calloc时,由于bucket大小为0,因此插入时会出错。在我打电话给预备队后,效果很好


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

您是正确的,
malloc()
等不运行构造函数,而
new
运行构造函数

您不能依赖在
calloc()
之后调用
reserve()
来解决问题。没有。代码的行为仍然是静态的,它可以在任何时候以任何它喜欢的方式爆炸

解决此问题的一种方法是使用调用
无序映射的构造函数


或者,您可以将该字段转换为指针,
calloc()
struct
,然后使用
new
分配和构造
无序映射。如果您这样做,您将不得不手动
删除它。

您是正确的,
malloc()
等不运行构造函数,而
new
运行构造函数

您不能依赖在
calloc()
之后调用
reserve()
来解决问题。没有。代码的行为仍然是静态的,它可以在任何时候以任何它喜欢的方式爆炸

解决此问题的一种方法是使用调用
无序映射的构造函数


或者,您可以将该字段转换为指针,
calloc()
struct
,然后使用
new
分配和构造
无序映射。如果执行此操作,则必须手动
删除它。

C内存分配函数通常不会调用构造函数。看见第一个答案很好地总结了:在C++中不要使用<代码> Mulalc < /Cord>。

< P>内存分配函数通常不调用构造函数。看见第一个答案很好地总结了:在C++中不要使用<代码> Mulalc < /Cord>。<> >代码> CaloC不初始化对象QA对象。它基本上是给你一个指针,指向一些满是零的内存。因此,任何需要初始化的内部字段(如地图)都无法获取您不应该将calloc与对象结合使用。(实际上,您可能根本不需要它。)

calloc
不会将对象初始化为对象。它基本上是给你一个指针,指向一些满是零的内存。因此,任何需要初始化的内部字段(如地图)都无法获取您不应该将calloc与对象结合使用。(实际上,您可能根本不需要它。)

为什么要强制使用calloc?这是遗留代码。我只是给它添加了一个新字段,它恰好是一个无序的地图。这很公平。我想这意味着你也不能使用placement new?为什么你必须使用calloc?这是遗留代码。我只是给它添加了一个新字段,它恰好是一个无序的地图。这很公平。我想这意味着你也不能使用新的布局?通常?他们永远不会调用构造函数。(嗯,
char
可能是一个例外)鉴于我不可能知道每个实现的行为,我通常坚持使用。通常?他们永远不会调用构造函数。(嗯,
char
可能是一个例外)鉴于我不可能知道每个实现的行为,我通常坚持使用。