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

“新”,“malloc”和“calloc”等家族的区别是什么?

(什么时候)需要“新”以外的东西吗?

其中一个使用其他吗?

newdelete是C ++特有的function。 他们在C中不存在malloc是老派C做事的方式。 大多数情况下,你不需要在C ++中使用它。

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

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

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

malloc / free +系列:

  • malloc / free / family是从堆中分配和释放内存的C方式。
  • calloc和malloc一样,但是也初始化了内存
  • 如果您可能需要重新分配内存应该使用
  • 数据不能用malloc分配,用delete或delete []释放

另请参阅我的相关答案

  • 新分配和呼叫ctor(订单未指定),删除dtor并将呼叫分配的内存释放到新的
  • malloc只分配一些内存,免费删除由malloc分配的内存
  • 新的可以用malloc来实现(虽然不是标准要求)
  • calloc与malloc做同样的事情,也将新分配的内存归零

正如其他文章指出的:malloc / free是C ++的一部分,与C兼容。

另请参阅: Stroustrup:new vs malloc

使用新的意味着将在新分配的内存上调用构造函数。 如果被分配的东西没有构造函数,new在function上和malloc是一样的。 通常应该引用它。

新的可能或不可能用malloc来实现 – C ++标准不需要任何一种方法。

除了新的,你不需要任何东西。 它是C ++中malloc的完全替代品。

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

警告一句:不要混用这两个成语。 结果是不确定的。

新的和malloc之间的主要区别我可以回想起来的是,你不能用realloc重新分配新分配的内存。 所以,如果你想增加/减less内存块的大小,你必须分配一个新的块,并复制一切。

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

当你新build一个对象时,对象的空间不仅被分配,而且对象的构造函数被调用。 但是这是C ++方式完成的, malloc是分配内存C中的旧版本方式。 callocmalloc是一样的,除了清除内存到所有零位。