【问题标题】:malloc/free and new/delete compatibility in C++?C++ 中的 malloc/free 和 new/delete 兼容性?
【发布时间】:2013-10-03 08:59:34
【问题描述】:

对 malloc/free 和 new/delete here 进行了很好的比较,并很好地解释了 malloc() 和 free() 如何工作 here。显然,我们不会将它们混合使用——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;
    

【问题讨论】:

  • 是的,但您甚至不应该在自己的代码中使用newmalloc;请改用 unique_ptrshared_ptr 之类的智能指针。
  • 我认为这是合法的。
  • 您是否确保永远不会为具有构造函数或析构函数的类型调用malloc()free()?这些调用不会执行您的类的构造函数和析构函数,因此可能会导致问题。

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


【解决方案1】:

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

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

【讨论】:

  • 请记住,malloc 只能用于 POD 数据类型,因为它不运行构造函数。
  • @Angew 你仍然可以使用malloc 你只需要使用placement new 并自己调用析构函数。 T* p = ::new(std::malloc(sizeof(T))) T(some, args); p->~T(); std::free(p);
  • @Simple 好吧,是的。但问题是为什么。
  • @Simple:您省略了malloc() 返回值空值检查。
  • @Angew 你是对的,如果你有其他选择,你不会写它,但有时 C 库会为你 malloc 内存,你必须这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多