何时使用Malloc而不是New

时间:2009-04-30 17:34:52

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

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

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

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

  • 我什么时候会使用malloc代替new?

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

9 个答案:

答案 0 :(得分:15)

一对想起来的夫妇:

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

答案 1 :(得分:4)

来自new/malloc上的Stroustrup常见问题我发布在该主题上:

  

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

这应该回答你的问题。

答案 2 :(得分:2)

我可以想到在C ++中使用malloc的最佳原因是与纯C API交互时。我曾经使用的一些C API拥有某些参数的内存。因此,他们负责释放内存,因此内存必须是免费的。 Malloc将为这个puprose工作,但不一定是新的。

答案 3 :(得分:2)

在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));

他们看起来很公平。但是,第一个的codegen实际检查count * sizeof(MyStruct).中的整数溢出。如果count来自不受信任的源,它可能导致整数溢出,导致分配少量内存,但是当你使用count时超出缓冲区。

答案 4 :(得分:2)

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

我看到的另一种情况是:

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

否则我不确定。一个人为的例子是当你不希望析构函数在退出时运行时,但在这种情况下,你应该拥有无论如何都有无操作符的对象。

答案 8 :(得分:0)

如果您不想担心捕获异常(或使用非抛出版本的新版本),则可以使用malloc。