当类对象最终化时,为C++类的数据成员动态分配的内存是否可以释放?

Ehs*_*hmi 1 c++ memory free allocation dynamic

我有这个C++类:

class test{

    char* p;
    SomeClass* someObject;

   test(){
      ...
      p = (char*) malloc(1000);
      someObject = new SomeClass();
      ...
   }

   ~test(){}

}
Run Code Online (Sandbox Code Playgroud)

我是否需要调用free(p)delete someObject显式测试析构函数以释放其分配的内存或内存将自动释放?

jua*_*nza 8

您需要在析构函数中释放所有动态分配的内存.这不会自动完成.

你的类包含两个指针,基本上无法控制这些指向的内容.实际上,这些可能指向您不允许删除的对象,例如:

struct Foo {};
struct Bar {
  Foo* f_;
  Foo(Foo* f) : f(f_) {}
};

int main() {
  Foo f;
  Bas b(&f); // b has a Foo ptr, but should it delete it?
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到指针数据成员自动删除并不合理.

作为一般规则,如果您的班级管理资源1,那么您应该负责复制构造和分配; 这意味着,如果对类有意义,则应该禁用它们,或者为它们提供实现,因为编译器生成的那些不起作用.有关此主题的详细讨论,请参阅规则三,以及有关stackoverflow的广泛讨论:

如果不遵循此规则,则默认的复制构造函数和赋值操作将生成浅表副本,并且您将有多个实例具有指向相同动态分配对象的指针,这些对象在销毁时都会尝试删除.

您可以避免手动删除new使用智能指针创建的对象.在你的情况下,类显然拥有动态分配的对象,你应该看看C++ 11的std :: unique_ptrboost :: scoped_ptr

最后,除非你真的需要,否则你可以通过避免所有指针来避免所有内存管理问题.你可以取代你char*std::string,例如:

class test{

    std::string p;
    SomeClass someObject;
    //test() : someObject() {} // default construction is probably OK...
};
Run Code Online (Sandbox Code Playgroud)

即,它分配和释放内存,或打开和关闭网络连接,或创建和销毁互斥锁​​等.