何时使用 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 [重复]