c++ - c++ 中的 malloc/free 和 new/delete 兼容性?

标签 c++ malloc new-operator free delete-operator

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

我们可以看到很多开源项目,有很多贡献者,使用这两种机制,同时遵守上述“禁止混合”规则。通常,您在一个文件中只有一种方式(一位作者,一种偏好)。我已经 fork 了这样一个项目,我正在使用 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;
    

最佳答案

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

请注意,当您有多个库时,这并不是那么容易 - 它们可能使用不同的堆,因此即使您使用正确命名的函数,它也可能碰巧在错误的模块中实现,因此使用错误的堆会驱动您进入未定义的行为。参见 this answer以便更好地理解我在这里谈论的内容。

关于c++ - c++ 中的 malloc/free 和 new/delete 兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19154980/

相关文章:

python - 有没有办法让我的 blit 在第一次迭代后重复自身?

c++ - 对 Boost 线程的 undefined reference

c - fscanf() 和 realloc() - 将文件读取到矩阵

c++ - 使用 malloc、char 数组和指针

c - 在 C 中,如何访问此结构中的元素?

java - 如何使用给定的构造函数创建对象

C++对象内存消耗

c++ - lambda 表达式的右值和左值引用 - gcc 与 msvc

c++ - 如果函数在类范围内声明,则 constexpr 不起作用

c++ Bresenham's line algorithm 绘制圆弧和旋转