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

时间:2012-03-31 03:24:43

标签: c++ memory-management destructor

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

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

int main(void) {
  C* myC = new C();
  delete myC;
  return 0;
}

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

5 个答案:

答案 0 :(得分:6)

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

由于你没有基类,你的成员变量是原始类型,它根本不会做任何事情。

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

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

答案 1 :(得分:5)

隐式定义的(默认)析构函数将为每个成员调用析构函数。对于成员数组,它将为数组的每个元素调用析构函数。

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

答案 2 :(得分:5)

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

class X { 
    int x; 
    int *y;
public:
    X() : y(new int) {}
    ~X() : { delete y; }    
};

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

答案 3 :(得分:0)

您调用new的任何内容都必须具有相应的删除权限。如果您没有调用new来创建某个实例,那么您不必调用delete。

答案 4 :(得分:-1)

您不必编写析构函数。 C ++类具有默认的析构函数,用于在“返回0”之后删除对象以回收内存。