C ++中“new”和“malloc”和“calloc”有什么区别?

时间:2009-04-30 16:47:59

标签: c++ memory-management malloc heap

“new”和“malloc”和“calloc”以及其他家庭有什么区别?

(何时)我需要除“新”以外的任何其他内容吗?

其中一个是否使用其他任何一个实现?

7 个答案:

答案 0 :(得分:69)

newdelete是C ++特有的功能。它们不存在于C. malloc是旧学校C的做事方式。大多数情况下,您不需要在C ++中使用它。

  • malloc分配未初始化的内存。分配的内存必须与free一起发布。
  • callocmalloc类似,但使用常量(0)初始化已分配的内存。需要使用free
  • 释放它
  • new通过调用构造函数(如果它是一个对象)初始化分配的内存。分配有new的内存应与delete一起释放(后者又调用析构函数)。它不需要您手动指定所需的大小并将其强制转换为适当的类型。因此,它更现代,更不容易出错。

答案 1 :(得分:20)

新/删除+新[] /删除[]:

  • new / delete是C ++分配内存和从堆中释放内存的方法。
  • new []和delete []是分配连续内存数组的c ++方法。
  • 应该使用,因为它比malloc更安全,
  • 应该使用,因为它调用构造函数/析构函数
  • 不能以realloc方式使用,但可以使用placement new来重用相同的数据缓冲区
  • 无法使用new分配数据并使用free释放,也不能删除[]

malloc / free + family:

  • malloc / free / family是从堆中分配和释放内存的C方式。
  • calloc与malloc相同,但也初始化内存
  • 如果您需要重新分配内存,则应该使用
  • 无法使用malloc分配数据并使用delete删除也不能删除[]

另见related answer here

答案 2 :(得分:8)

  • 新分配和调用ctor(订单未指定),删除dtor并释放通过调用新分配的内存
  • malloc只分配一些内存,free删除malloc分配的内存
  • new可以使用malloc实现(标准不要求)
  • calloc与malloc做同样的事情,并将新分配的内存归零

正如其他帖子所指出的那样:malloc / free是C ++的一部分,与C兼容。

另见:Stroustrup: new vs malloc

答案 3 :(得分:5)

使用new意味着将在新分配的内存上调用构造函数。如果正在分配的东西没有构造函数,则new在功能上与malloc相同。通常应该用于它。

new可能会或可能不会以malloc的形式实现 - C ++标准不需要任何一种方法。

答案 4 :(得分:5)

除了新内容之外,您不需要任何其他内容。它完全取代了C ++中的malloc。

至于区别:Malloc只是分配内存。新分配的内存并调用构造函数。同样免费只是释放内存。删除释放内存并调用析构函数。

警告:不要混淆两个成语。结果未定义。

答案 5 :(得分:1)

我可以回忆一下new和malloc之间的主要区别是你不能重新分配new使用realloc分配的内存。因此,如果您想增加/减少内存块的大小,则必须分配一个新块并复制所有内容。

Calloc允许您初始化您分配的内存块,而malloc则不会。

答案 6 :(得分:1)

当你 new 一个对象时,不仅会分配对象的空间,而且会调用对象的构造函数。但这是它完成的C ++方式, malloc 是分配内存的 C 中的旧版本方式。 calloc malloc 相同,只是它将内存清除到所有位为零。