在C++中,“new”和“malloc”以及“calloc”的区别是什么?

57

"new"、"malloc"和"calloc"等函数有何区别?

除了"new"以外,什么时候需要用到其他函数?

它们之间是否有互相实现的情况?


2
如果您正在使用STL,则很少需要使用显式内存分配。 - Brian
1
新的delete和malloc/free之间有什么区别? - Michael Myers
请查看重复的相关问题,因为它的答案更完整:https://dev59.com/f3VC5IYBdhLWcg3wnCaA - brita_
7个回答

78

newdelete是C++语言特有的功能,在C语言中不存在。使用malloc是C语言中传统的方式,但在大多数情况下,在C++中不需要使用malloc

  • malloc分配未初始化的内存,必须使用free释放所分配的内存。
  • callocmalloc类似,但会将分配的内存初始化为常量(0)。需要使用free释放。
  • new通过调用构造函数来初始化分配的内存(如果是对象)。使用new分配的内存应该使用delete释放(它会调用析构函数)。使用new时不需要手动指定所需大小并将其强制转换为适当的类型。因此,更加现代化且不易出错。

1
“scratch space”是你刚刚发明的术语吗? - anon
1
@Neil Butterworth:我不确定。但我想我在某处读过它... 术语表: scratch space: n. 未初始化的内存 :) - Mehrdad Afshari
保持C++特定术语,数组也是一个对象,其所有子对象的构造函数都将被调用。 - Johannes Schaub - litb
我认为这很令人困惑 - 我们在这个领域已经有足够的术语了。new分配动态内存。 - anon
修改后的内容遵循C++术语,以减少混淆的可能性。 - Mehrdad Afshari
刮擦空间通常是硬盘上用于临时存储的磁盘空间。参考来源:http://www.wisegeek.com/what-is-scratch-space.htm - internals-in

24

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

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

malloc/free + family:

  • malloc/free/family 是C语言中从堆上分配和释放内存的方式。
  • callocmalloc相同,但也会初始化内存。
  • 如果可能需要重新分配内存,则应使用它。
  • 不能使用malloc分配内存然后使用delete或者delete[]进行释放。

另请参阅我的相关回答


@Martin York:我现在从链接的重复问题中看到了。不过我更喜欢你的列表 :) 我认为这是这些类型的问题的最佳格式,可以比较和对比两个事物。至少我总是能得到高票数的答案。 - Brian R. Bondy

8
  • new分配内存并调用构造函数(顺序未指定),delete调用析构函数并释放由new分配的内存。
  • malloc仅分配一些内存,free删除由malloc分配的内存。
  • new可以使用malloc实现(虽然标准不要求)。
  • callocmalloc执行相同的操作,并且还将新分配的内存初始化为零。

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

另请参见:Stroustrup:new vs malloc


6

你只需要new,不需要其他。在C++中,它完全替代了malloc。

至于区别:malloc只分配内存。new分配内存并调用构造函数。同样,free只释放内存。delete释放内存并调用析构函数。

警告一句话:不要混合使用这两种习惯用法。结果是未定义的。


点击此链接 http://www.ritambhara.in/difference-between-malloc-calloc-free-and-realloc-functions/。 - Jaichander

5

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

new可能是基于malloc实现的,也可能不是 - C++标准并不要求任何一种方法。


2

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

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


事实上,对于“malloc”也是如此。 “realloc”函数大多数时候都这样做。 - Mehrdad Afshari

1
当你new一个对象时,不仅会分配对象的空间,还会调用对象的构造函数。但这是C++的方式,C中分配内存的旧版本方法是使用malloccallocmalloc相同,除了它将内存清零为所有位都是零。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接