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】:

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

malloc 分配未初始化的内存。分配的内存必须用free 释放。 callocmalloc 类似,但使用常量 (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 方式。 callocmalloc 相同,但也会初始化内存 如果您可能需要重新分配内存,应该使用 无法使用malloc 分配数据并使用delete 或delete[] 释放数据

另见我的related answer here

【讨论】:

@Martin York:我现在从链接的重复问题中看到。不过,我更喜欢你的列表 :) 我认为这是这类问题的投注格式,您可以在其中比较和对比 2 件事。至少我总是对那种格式化的答案获得高票。【参考方案3】: new 分配和调用 ctor(顺序未指定),delete dtor 并释放调用 new 分配的内存 malloc 只分配一部分内存,free 删除malloc 分配的内存 new 可以使用 malloc 实现(尽管标准没有要求) callocmalloc 做同样的事情,并且零初始化新分配的内存

正如其他帖子所指出的: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++ 完成的方式,ma​​llocC 中分配内存的旧版本方式。 callocma​​lloc 相同,只是它将内存清零。

【讨论】:

以上是关于C ++中的“new”和“malloc”和“calloc”有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的malloc和new之间是不是有任何性能差异[关闭]

C++—new/delete/malloc/free详解

c的free和c++的delete的区别

C malloc和calloc函数总结

new 和 malloc 的区别 及使用

malloc和new的区别 end