malloc/free 和 new/delete 有一个很好的比较 here ,以及 malloc() 和 free() 如何工作的很好的解释 here .显然,我们不会混合使用它们 - 将 free 与 new 一起使用或将 delete 与 malloc 一起使用。
我们可以看到很多开源项目,有很多贡献者,使用这两种机制,同时遵守上述“禁止混合”规则。通常,您在一个文件中只有一种方式(一位作者,一种偏好)。我已经 fork 了这样一个项目,我正在使用 new/delete 添加一些功能。但是我遇到了一些奇怪的内存损坏。当然,我可能对他们负责,但是.....
这让我问了一些“幼稚”的问题:
我可以在同一个编译单元 (*.o) 中同时使用 malloc/free 和 new/delete 这两种机制吗?当然,遵守“不混合”规则?
我可以像这段代码一样交错使用这两种机制吗?
int *a = (int *) malloc (1000 * sizeof int); int *b = new int[1000]; // some code free a; delete[] b;
最佳答案
是的,您可以将它们交错放置 - 只需使用与用于分配的函数匹配的释放函数即可。仅当您使用错误的释放函数时才会出现此问题。
请注意,当您有多个库时,这并不是那么容易 - 它们可能使用不同的堆,因此即使您使用正确命名的函数,它也可能碰巧在错误的模块中实现,因此使用错误的堆会驱动您进入未定义的行为。参见 this answer以便更好地理解我在这里谈论的内容。
关于c++ - c++ 中的 malloc/free 和 new/delete 兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19154980/