C++中的 malloc/free 和 new/delete 兼容性

malloc/free and new/delete compatibility in C++?

本文关键字:new delete 兼容性 free 中的 malloc C++      更新时间:2023-10-16

这里有一个很好的malloc/free和new/delete的比较,以及malloc()和free()在这里如何工作的很好的解释。显然,我们不会将它们混合使用 - 使用 free 与新的或删除与 malloc。

我们可以看到很多开源项目,有许多贡献者,使用这两种机制,同时尊重上述"无混合"规则。通常,您在一个文件中只有一种方式(一个作者,一个首选项)。我已经分叉了这样一个项目,并且正在使用new/delete添加一些功能。但是我遇到了一些奇怪的内存损坏。当然,我可能对他们负责,但是.....

这导致我问一些"幼稚"的问题:

  1. 我可以在同一个编译单元 (*.o) 中同时使用malloc/free和new/delete两种机制吗 - 当然,尊重"无混合"规则?

  2. 我可以交错这两种机制吗,就像在这段代码中一样?

    int *a = (int *) malloc (1000 * sizeof int);
    int *b = new int[1000];
    // some code
    free a;
    delete[] b;
    

是的,您可以交错它们 - 只需使用与用于分配的函数匹配的释放函数。仅当您使用错误的释放函数时,才会出现问题。

请注意,当您有多个库时,这并不容易 - 这些库可能使用不同的堆,因此即使您使用正确的命名函数,它也可能发生在错误的模块中实现,因此使用错误的堆,这将导致您直接进入未定义的行为。请参阅此答案以更好地了解我在这里谈论的内容。