C++ 中的“new”和“malloc”和“calloc”有什么区别?[复制]
-
03-07-2019 - |
题
“new”和“malloc”和“calloc”以及家族中的其他人有什么区别?
(何时)除了“新”之外我还需要其他东西吗?
其中之一是否使用其他实现?
解决方案
new
和 delete
是 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 相同,只是它将内存清除到所有位为零。
不隶属于 StackOverflow