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的析构函数来明确地执行此操作?
构造函数(在没有任何ctor-initializer-list的情况下)调用每个子对象的默认构造函数.
由于您没有基类,并且您的成员变量是原始类型,因此它根本不执行任何操作.
与析构函数相同.你自己是隐式编译器生成的,因为你没有声明它,它将为每个子对象调用析构函数.再一次,这是微不足道的,因为你唯一的子对象是基元的集合.
现在,删除它时,将释放该类的所有内存.由于数组嵌入在类中,因此它是同一内存区域的一部分,并且将同时释放.
隐式定义的(默认)析构函数将为每个成员调用析构函数.在成员数组的情况下,它将为数组的每个元素调用析构函数.
请注意,指针没有析构函数; 你需要手动删除它们.您在提供的示例中没有此问题,但需要注意这一点.
如果你的类/结构包含一个指针,并且你为该指针显式分配了一些内容,那么你通常需要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中销毁它.