free() 会导致内存泄漏吗?

Can free() cause a memory leak?

调用 delete 会调用 class 的析构函数,但调用 free() 不会。

这会导致内存泄漏吗?如果不是,为什么?

#include <iostream>
#include <cstdlib>
using namespace std;

class x{
 public:
 int a;
 ~x(){cout<<"destroying"<<endl;}
};


int main() {
  x *y = (x*)malloc(sizeof(x));
  free(y);
  x *z = new x;
  delete z;
  return 0; 
}

Can free() cause a memory leak?

并非如此。但它可能会导致未定义的行为。当然,如果程序的行为未定义,则内存泄漏是可能的行为之一。与所有其他行为一样。

Can that cause a memory leak?

在你的具体例子中,没有。 x 对象仅由 malloc() 分配free() 将正确地 释放 malloc() 分配的内存。但是对象不会 destructed,这在这个例子中很好,因为它不是 constructed 开始的,所以没有什么可破坏的。但是,如果您尝试以任何期望构造函数具有 运行 的方式使用该对象,那么您最终会陷入 未定义行为 领域。

C(malloc()free() 来自)没有 类 的概念,只有 内存(取消)分配 的概念。另一方面,C++有内存(去)分配对象(去)构造的独立概念,所以你需要非常小心正确使用它们而不是错误地混淆它们。

如果对象是通过 new 构造,但随后 free() 解除分配 而不是 delete破坏,代码肯定会有未定义的行为,如果那个对象在内部为它自己分配了任何额外的内存析构函数应该释放,额外的内存会泄漏,是的。