“new”和“malloc”和“calloc”以及家族中的其他人有什么区别?

(何时)除了“新”之外我还需要其他东西吗?

其中之一是否使用其他实现?

有帮助吗?

解决方案

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

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

其他提示

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

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

malloc/free + 系列:

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

另请参阅我的 相关答案在这里

  • new 分配并调用 ctor(顺序未指定),删除 dtor 并释放调用 new 分配的内存
  • malloc只分配部分内存,free删除malloc分配的内存
  • new 可以使用 malloc 实现(尽管标准不要求)
  • calloc 与 malloc 执行相同的操作,并将新分配的内存清零

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

另请参阅: 斯特劳斯特鲁普:new 与 malloc

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

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

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top