何时使用 Malloc 而不是 New [重复]

Posted

技术标签:

【中文标题】何时使用 Malloc 而不是 New [重复]【英文标题】:When to use Malloc instead of New [duplicate] 【发布时间】:2010-10-22 22:19:23 【问题描述】:

重复:In what cases do I use malloc vs new?

刚刚重读这个问题:What is the difference between "new" and "malloc" and "calloc" in C++?

我检查了答案,但没有人回答这个问题:

什么时候可以使用 malloc 而不是 new?

有几个原因(我能想到两个)。 让最好的漂浮到顶部。

【问题讨论】:

查看***.com/questions/240212/…的答案 @dana - 这没有解决当前的问题。 【参考方案1】:

脑海中浮现的一对:

当您需要在 C++ 和 C 之间移植代码时。 当您在可能从 C 调用的库中分配内存时,C 代码必须释放分配。

【讨论】:

这引出了问题。为什么在 C++ 中避免它而不是在 C 中?当然,一个明显的答案是因为我们有关键字“新”。现在我们开始了:为什么使用 new 而不是 malloc?这并没有回答问题。 @DonLarynx “为什么使用 new 而不是 malloc?”因为它会在适当的时候调用构造函数。【参考方案2】:

来自new/malloc 上的 Stroustrup 常见问题解答我在该线程上发布:

每当您使用 malloc() 时,您必须考虑初始化并将返回指针转换为正确的类型。您还必须考虑是否有适合您使用的字节数。考虑到初始化时, malloc() 和 new 之间没有性能差异。

这应该可以回答您的问题。

【讨论】:

说实话,我不明白。【参考方案3】:

我能想到在 C++ 中使用 malloc 的最佳原因是与纯 C API 交互时。我使用过的一些 C API 拥有某些参数的内存。因此,它们负责释放内存,因此内存必须可以通过 free 释放。 Malloc 将适用于此目的,但不一定是新的。

【讨论】:

【参考方案4】:

在 C++ 中,几乎没有。 new 通常是调用构造函数的 malloc 的包装器(如果适用)。

但是,至少对于 Visual C++ 2005 或更高版本,using malloc can actually result in security vulnerabilities over new。

考虑这段代码:

MyStruct* p = new MyStruct[count];
MyStruct* p = (MyStruct*)malloc(count* sizeof(MyStruct));

它们看起来相当。但是,第一个代码生成器实际上会检查count * sizeof(MyStruct). 中的整数溢出如果 count 来自不受信任的来源,它可能会导致整数溢出,从而导致分配少量内存,但是当您使用 count 时,您会超出缓冲区。

【讨论】:

如果您不对来自不受信任来源的计数进行任何健全性检查,那么无论您使用 malloc 还是 new,都会存在安全漏洞。 这只是另一个防御层,绝对不允许你盲目信任数据。 第二个例子应该是在 C 中使用 calloc,它会做溢出检查: MyStruct *p = calloc(count, sizeof(MyStruct));【参考方案5】:

每个人都提到(使用略有不同的词)在使用将使用 free() 的 C 库时,周围有很多这样的。

我看到的另一种情况是:

在了解您自己的内存管理时(因为某些原因您通过建模发现默认值不够好)。您可以使用 malloc 分配内存块,并使用placement new 初始化池中的对象。

【讨论】:

为什么不用new分配原始内存? void* buffer = new char[100000];完全合法的c++ 如果你想要原始内存,相当于 malloc 将是 operator new,例如void* 缓冲区 = ::operator new(100000);虽然 char 是基本类型,所以在构造或销毁时不会做任何危险的事情,但使用 operator new 在语义上比使用 char 数组对象然后将其底层存储重用于一组不同的对象在语义上更清晰。 是的,它们都是 malloc 的不错替代品。在我亲自实际使用 malloc 之前,我需要(通过测量)证明 malloc 明显更快(因为我什至会进行内存管理的唯一原因是我需要一些速度)。【参考方案6】:

其中一个原因是在 C++ 中,您可以重载 new 运算符。

如果您想确保在代码中使用系统库内存分配,您可以使用 malloc。

【讨论】:

你也可以调用 ::new 不是吗? 你永远无法真正确定(例如,你可以预加载你的 libc 来调用你 malloc/free),而且你不应该编写必须关心的代码。 更不用说可以覆盖全局new了。【参考方案7】:

C++ 程序员应该很少需要调用 malloc。我能想到的这样做的唯一原因是一个糟糕的 API,它期望你传入 malloc 的内存,因为它会做免费的。在您自己的代码中,new 应该始终等于 malloc。

【讨论】:

【参考方案8】:

如果要通过 free() 释放内存(在您或其他人的代码中),则非常需要使用 malloc。

否则我不确定。一种人为的情况是,当您不希望在退出时运行析构函数时,但在这种情况下,您可能应该拥有具有无操作 dtor 的对象。

【讨论】:

【参考方案9】:

当您不想担心捕获异常时,可以使用 malloc(或使用非抛出版本的 new)。

【讨论】:

以上是关于何时使用 Malloc 而不是 New [重复]的主要内容,如果未能解决你的问题,请参考以下文章

new 在堆栈而不是堆上(如 alloca 与 malloc)

何时在 mysql 中使用 TEXT 而不是 VARCHAR [重复]

如何检查是不是使用 malloc 或 new 分配了内存

删除/释放由 malloc 分配并由 new [重复] 重用的内存

c ++中new和malloc之间的区别[重复]

::operator new(size_t) 是不是使用 malloc()?