【问题标题】:Can free() cause a memory leak?free() 会导致内存泄漏吗?
【发布时间】:2021-03-23 03:46:11
【问题描述】:

调用delete 调用类的析构函数,但调用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; 
}

【问题讨论】:

标签: c++ destructor free delete-operator


【解决方案1】:

这会导致内存泄漏吗?

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

C(malloc()free() 来自哪里)没有类的概念,只有内存(解除)分配。另一方面,C++ 有 memory (de)allocationobject (de)construction 的独立概念,因此您需要非常小心地正确使用它们并不要把它们弄错。

如果一个对象是通过new构造,然后被free()释放而不是被delete销毁,代码肯定会有未定义的行为,并且如果该对象在内部为自己分配了任何额外的内存,而该对象的析构函数预计会释放,那么额外的内存就会泄漏,是的。

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 如果x拥有内存,比如拥有std::string内存,那么会间接导致内存泄漏
猜你喜欢
  • 2021-09-25
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 2011-06-16
  • 2011-10-28
  • 1970-01-01
相关资源
最近更新 更多