【问题标题】:When to use Malloc instead of New [duplicate]何时使用 Malloc 而不是 New [重复]
【发布时间】: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?

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

【问题讨论】:

标签: c++ malloc new-operator dynamic-memory-allocation


【解决方案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)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-03
          • 2011-11-19
          • 2014-10-23
          • 1970-01-01
          • 2019-07-31
          相关资源
          最近更新 更多