这里有一个很好的malloc/free和new/delete的比较,以及malloc()和free()在这里如何工作的很好的解释。显然,我们不会将它们混合使用 - 使用 free 与新的或删除与 malloc。
我们可以看到很多开源项目,有许多贡献者,使用这两种机制,同时尊重上述"无混合"规则。通常,您在一个文件中只有一种方式(一个作者,一个首选项)。我已经分叉了这样一个项目,并且正在使用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;
是的,您可以交错它们 - 只需使用与用于分配的函数匹配的释放函数。仅当您使用错误的释放函数时,才会出现问题。
请注意,当您有多个库时,这并不容易 - 这些库可能使用不同的堆,因此即使您使用正确的命名函数,它也可能发生在错误的模块中实现,因此使用错误的堆,这将导致您直接进入未定义的行为。请参阅此答案以更好地了解我在这里谈论的内容。