4

这里对 malloc/free 和 new/delete 进行了很好的比较,并很好地解释了 malloc() 和 free() 的工作原理。显然,我们不会将它们混合使用——将 free 与 new 或 delete 与 malloc 一起使用。

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

这让我问了一些“幼稚”的问题:

  1. 我可以在同一个编译单元 (*.o) 中同时拥有 malloc/free 和 new/delete 两种机制吗?当然,尊重“no-mix”规则?

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

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

1 回答 1

7

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

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

于 2013-10-03T09:03:34.103 回答