默认析构函数的作用是多少

Rob*_*obz 10 c++ destructor memory-management

C++类中的默认析构函数是否会自动删除未在代码中显式分配的成员?例如:

class C {
  public:
    C() {}
    int arr[100];
};

int main(void) {
  C* myC = new C();
  delete myC;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

删除myC会自动解除myC的arr吗?或者我是否需要编写C的析构函数来明确地执行此操作?

Ben*_*igt 7

构造函数(在没有任何ctor-initializer-list的情况下)调用每个子对象的默认构造函数.

由于您没有基类,并且您的成员变量是原始类型,因此它根本不执行任何操作.

与析构函数相同.你自己是隐式编译器生成的,因为你没有声明它,它将为每个子对象调用析构函数.再一次,这是微不足道的,因为你唯一的子对象是基元的集合.

现在,删除它时,将释放该类的所有内存.由于数组嵌入在类中,因此它是同一内存区域的一部分,并且将同时释放.


Mar*_*som 5

隐式定义的(默认)析构函数将为每个成员调用析构函数.在成员数组的情况下,它将为数组的每个元素调用析构函数.

请注意,指针没有析构函数; 你需要手动删除它们.您在提供的示例中没有此问题,但需要注意这一点.


Jer*_*fin 5

如果你的类/结构包含一个指针,并且你为该指针显式分配了一些内容,那么你通常需要delete在dtor中编写一个匹配项.直接嵌入到类/结构中的成员将自动创建和销毁.

class X { 
    int x; 
    int *y;
public:
    X() : y(new int) {}
    ~X() : { delete y; }    
};
Run Code Online (Sandbox Code Playgroud)

这里将自动创建/销毁X :: x.X :: y(或者,技术上正确,X :: y指向的)不会 - 我们在ctor中分配它并在dtor中销毁它.