重复:In what cases do I use malloc vs new?
重新阅读这个问题:
What is the difference between "new" and "malloc" and "calloc" in C++?
我检查了答案,但没有人回答这个问题:
有几个原因(我可以想到两个) 让最好的浮动到顶部。
答案 0 :(得分:15)
一对想起来的夫妇:
答案 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。