【问题标题】:calloc(), malloc() vs new-ing a struct that has an unordered_map insidecalloc(), malloc() vs new-ing 一个内部有一个 unordered_map 的结构
【发布时间】:2013-04-11 15:53:22
【问题描述】:

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

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

【问题讨论】:

  • 为什么要强制使用calloc?
  • 这是遗留代码。我只是在其中添加一个新字段,它恰好是一个无序的地图。
  • 很公平。我想这意味着你也不能使用placement new?

标签: c++ memory-management malloc calloc


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 通常?他们将永远调用构造函数。 (好吧,char 可能是一个例外)
    • 鉴于我不可能知道每个实现的行为,我通常坚持下去。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2021-02-22
      • 2020-03-22
      • 1970-01-01
      • 2015-02-12
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多