56

new“ ” 和 “ malloc” 和 “ ” 和家庭中的其他人有什么区别calloc

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

其中一个是使用其他实现的吗?

4

7 回答 7

78

new并且delete是 C++ 特定的功能。它们在 C 中不存在。malloc是老式的 C 做事方式。大多数时候,您不需要在 C++ 中使用它。

  • malloc分配未初始化的内存。分配的内存必须用free.
  • calloc类似malloc,但使用常量 (0) 初始化分配的内存。它需要用free.
  • new通过调用构造函数初始化分配的内存(如果它是一个对象)。分配的内存new应该被释放delete(这反过来又调用析构函数)。它不需要您手动指定所需的大小并将其转换为适当的类型。因此,它更现代,更不容易出错。
于 2009-04-30T16:49:37.277 回答
24

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

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

malloc/ free+ 家庭:

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

也可以在这里查看我的相关答案

于 2009-04-30T16:51:49.050 回答
8
  • new分配和调用 ctor(未指定顺序)、deletedtor 并释放调用 new 分配的内存
  • malloc只分配一些内存,并free删除分配的内存malloc
  • new可以使用malloc(尽管标准不要求)实现
  • calloc与新分配的内存做同样的事情malloc并且零初始化

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

另见:Stroustrup:new vs malloc

于 2009-04-30T16:51:01.220 回答
6

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

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

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

于 2009-04-30T16:51:54.010 回答
5

使用 new 意味着将在新分配的内存上调用构造函数。如果被分配的东西没有构造函数,那么 new 在功能上与 malloc 相同。并且通常应该优先使用它。

new 可能会或可能不会根据 malloc 实现 - C++ 标准不需要任何一种方法。

于 2009-04-30T16:50:04.170 回答
2

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

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

于 2009-04-30T16:51:30.453 回答
1

当您新建一个对象时,不仅为该对象分配空间,而且还调用该对象的构造函数。但这是 C++ 完成的方式,mallocC中分配内存的旧版本方式。callocmalloc相同,只是它将内存清除为所有位为零。

于 2009-04-30T16:51:40.440 回答