C ++中的“new”和“malloc”和“calloc”有啥区别? [复制]
Posted
技术标签:
【中文标题】C ++中的“new”和“malloc”和“calloc”有啥区别? [复制]【英文标题】:What is the difference between "new" and "malloc" and "calloc" in C++? [duplicate]C ++中的“new”和“malloc”和“calloc”有什么区别? [复制] 【发布时间】:2010-10-22 22:01:37 【问题描述】:“new
”和“malloc
”和“calloc
”和其他家庭有什么区别?
(何时)除了“new
”之外,我还需要什么吗?
其中一个是使用其他实现的吗?
【问题讨论】:
如果您使用的是 STL,您应该很少需要使用显式内存分配。 重复***.com/questions/240212/… 检查重复的链接问题,因为它的答案更完整:***.com/questions/240212/… 【参考方案1】:new
和 delete
是 C++ 特定的功能。它们在 C 中不存在。malloc
是老式的 C 做事方式。大多数时候,您不需要在 C++ 中使用它。
malloc
分配未初始化的内存。分配的内存必须用free
释放。
calloc
与 malloc
类似,但使用常量 (0) 初始化分配的内存。需要使用free
释放它。
new
通过调用构造函数初始化分配的内存(如果它是一个对象)。用new
分配的内存应该用delete
(依次调用析构函数)释放。它不需要您手动指定所需的大小并将其转换为适当的类型。因此,它更现代,更不容易出错。
【讨论】:
“暂存空间”是您刚刚发明的术语吗? @Neil Butterworth:我不知道。但我想我在某处读过它... 词汇表:暂存空间:n。未初始化的内存:) 保留 c++ 特定的术语,数组也是一个对象,所有子对象的 ctor 都会被调用。 我认为这很令人困惑——我们在这个领域有足够的术语。 new 分配动态内存。 编辑为坚持使用 C++ 术语以减少混淆的机会。【参考方案2】:new
/delete
+ 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[] 释放数据
另见我的related answer here
【讨论】:
@Martin York:我现在从链接的重复问题中看到。不过,我更喜欢你的列表 :) 我认为这是这类问题的投注格式,您可以在其中比较和对比 2 件事。至少我总是对那种格式化的答案获得高票。【参考方案3】:new
分配和调用 ctor(顺序未指定),delete
dtor 并释放调用 new 分配的内存
malloc
只分配一部分内存,free
删除malloc
分配的内存
new
可以使用 malloc
实现(尽管标准没有要求)
calloc
和 malloc
做同样的事情,并且零初始化新分配的内存
正如其他帖子所指出的:malloc
/free
是与 C 兼容的 C++ 的一部分。
另见:Stroustrup: new vs malloc
【讨论】:
【参考方案4】:除了新的,你不需要任何东西。它是 C++ 中 malloc 的完全替代品。
至于区别:Malloc 只是分配内存。新分配的内存并调用构造函数。同样 free 只是释放内存。删除释放内存并调用析构函数。
一句警告:不要混淆这两个成语。结果未定义。
【讨论】:
点击此链接ritambhara.in/…【参考方案5】:使用 new 意味着将在新分配的内存上调用构造函数。如果被分配的东西没有构造函数,那么 new 在功能上与 malloc 相同。并且通常应该优先使用它。
new 可能会或可能不会根据 malloc 实现 - C++ 标准不需要任何一种方法。
【讨论】:
【参考方案6】:我记得 new 和 malloc 之间的主要区别是您不能使用 realloc 重新分配 new 分配的内存。因此,如果您想增加/减少内存块的大小,则必须分配一个新块并将所有内容复制过来。
Calloc 允许您初始化分配的内存块,而 malloc 不允许。
【讨论】:
其实malloc
也是这样。 realloc
函数大部分时间都是这样做的。【参考方案7】:
当您新建一个对象时,不仅会为该对象分配空间,还会调用该对象的构造函数。但这是 C++ 完成的方式,malloc 是 C 中分配内存的旧版本方式。 calloc 与 malloc 相同,只是它将内存清零。
【讨论】:
以上是关于C ++中的“new”和“malloc”和“calloc”有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章