只是重新阅读这个问题:
C ++中的“new”和“malloc”和“calloc”有什么区别?
我检查了答案,但没有人回答这个问题:
- 我什么时候会使用 malloc 而不是 new?
有几个原因(我可以想到两个)。
让最好的漂浮到顶部。
只是重新阅读这个问题:
C ++中的“new”和“malloc”和“calloc”有什么区别?
我检查了答案,但没有人回答这个问题:
有几个原因(我可以想到两个)。
让最好的漂浮到顶部。
突然想到的一对:
从new/malloc
我在该线程上发布的 Stroustrup 常见问题解答中:
每当您使用 malloc() 时,您必须考虑初始化并将返回指针转换为正确的类型。您还必须考虑是否有适合您使用的字节数。考虑到初始化时, malloc() 和 new 之间没有性能差异。
这应该回答你的问题。
我能想到在 C++ 中使用 malloc 的最佳原因是与纯 C API 交互时。我使用过的一些 C API 拥有某些参数的内存。因此,它们负责释放内存,因此内存必须可以通过 free 释放。Malloc 将适用于此目的,但不一定是新的。
在 C++ 中,几乎没有。new 通常是调用构造函数的 malloc 的包装器(如果适用)。
但是,至少在 Visual C++ 2005 或更高版本中,使用 malloc 实际上会导致新的.
考虑这段代码:
MyStruct* p = new MyStruct[count];
MyStruct* p = (MyStruct*)malloc(count* sizeof(MyStruct));
它们看起来相当。但是,第一个代码生成器实际上会检查count * sizeof(MyStruct).
如果 count 来自不受信任的源中的整数溢出,它可能会导致整数溢出,从而导致分配少量内存,但是当您使用 count 时,您会溢出缓冲区。
在使用将使用 free() 的 C 库时,每个人都提到过(使用略有不同的词),并且周围有很多这样的库。
我看到的另一种情况是:
了解您自己的内存管理时(因为某些原因,您通过建模发现默认值不够好)。您可以使用 malloc 分配内存块,并使用放置 new 初始化池中的对象。
原因之一是在 C++ 中,您可以重载 new 运算符。
如果您想确保在代码中使用系统库内存分配,您可以使用 malloc。
C++ 程序员应该很少需要调用 malloc。我能想到的这样做的唯一原因是一个糟糕的 API,它期望你传入 malloc 的内存,因为它会做免费的。在您自己的代码中,new 应该始终等于 malloc。
如果要通过 free() 释放内存(在您或其他人的代码中),则使用 malloc 非常需要。
否则我不确定。一种人为的情况是,当您不希望在退出时运行析构函数时,但在这种情况下,您可能应该拥有具有无操作 dtor 的对象。
当您不想担心捕获异常(或使用非抛出版本的 new)时,您可以使用 malloc。