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

lal*_*rde 4 c++ malloc free new-operator delete-operator

还有的malloc /自由和新的一个很好的比较/删除这里,好解释如何malloc()和free()的工作在这里.显然,我们不会混用它们 - 免费使用new或使用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;
    
    Run Code Online (Sandbox Code Playgroud)

sha*_*oth 7

是的,您可以交错它们 - 只需使用与用于分配的释放功能匹配的释放功能.只有在使用错误的释放函数时才会出现此问题.

请注意,当你有几个库时可能并不那么容易 - 那些可能会使用不同的堆,所以即使你使用正确的命名函数,它也可能恰好在错误的模块中实现,因此使用错误的堆将导致你进入undefined行为.请参阅此答案,以便更好地了解我在这里谈论的内容.