C ++类中的默认析构函数是否会自动删除未在代码中显式分配的成员?例如:
class C {
public:
C() {}
int arr[100];
};
int main(void) {
C* myC = new C();
delete myC;
return 0;
}
删除myC会自动解除myC的arr吗?或者我是否需要编写C的析构函数来明确地执行此操作?
答案 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”之后删除对象以回收内存。