malloc / free和new / delete here有一个很好的比较,并且很好地解释了malloc()和free()如何工作here。显然,我们不会混用它们 - 免费使用new或使用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;
答案 0 :(得分:7)
是的,您可以交错它们 - 只需使用与用于分配的释放功能匹配的释放功能。只有在使用错误的释放函数时才会出现此问题。
请注意,当你有几个库时可能并不那么容易 - 那些可能会使用不同的堆,所以即使你使用正确的命名函数,也可能碰巧在错误的模块中实现,所以使用错误的堆来驱动你直接进入未定义的行为。请参阅this answer以更好地了解我在这里谈论的内容。