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

Łuk*_*Lew 51 c++ heap malloc memory-management

"new"和"malloc"和"calloc"和其他家庭有什么区别?

(何时)除了"新"之外我还需要什么?

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

Meh*_*ari 71

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

  • malloc分配未初始化的内存.分配的内存必须与释放free.
  • calloc就像是malloc用常量(0)初始化分配的内存.它需要被释放free.
  • new通过调用构造函数(如果它是一个对象)初始化分配的内存.分配的内存new应该与delete(它反过来调用析构函数)一起释放.它不需要您手动指定所需的大小并将其强制转换为适当的类型.因此,它更现代,更不容易出错.


Bri*_*ndy 20

new/delete + new []/delete []:

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

malloc /免费+家庭:

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

另请参阅我的相关答案


dir*_*tly 8

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

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

另见:Stroustrup:new vs malloc


小智 5

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

新的可能会或可能不会实现malloc - C++标准不需要任何一种方法.


Ste*_*owe 5

你不需要除了新的东西.它完全取代了C++中的malloc.

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

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