2

重复:在什么情况下我使用malloc vs new?

只是重新阅读这个问题:
C ++中的“new”和“malloc”和“calloc”有什么区别?

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

  • 我什么时候会使用 malloc 而不是 new?

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

4

9 回答 9

15

突然想到的一对:

  • 当您需要在 C++ 和 C 之间移植代码时。
  • 当您在可能从 C 调用的库中分配内存时,C 代码必须释放分配。
于 2009-04-30T17:38:29.030 回答
4

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

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

这应该回答你的问题。

于 2009-04-30T17:41:49.320 回答
2

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

于 2009-04-30T17:38:59.890 回答
2

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

但是,至少在 Visual C++ 2005 或更高版本中,使用 malloc 实际上会导致新的.

考虑这段代码:

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

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

于 2009-04-30T17:40:07.827 回答
2

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

我看到的另一种情况是:

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

于 2009-04-30T17:55:18.883 回答
1

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

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

于 2009-04-30T17:39:21.103 回答
0

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

于 2009-04-30T17:38:28.970 回答
0

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

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

于 2009-04-30T17:39:30.590 回答
0

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

于 2009-04-30T17:42:45.793 回答