在C++类中, 默认析构函数会自动删除那些在代码中没有显式分配的成员吗?比如:
class C {
public:
C() {}
int arr[100];
};
int main(void) {
C* myC = new C();
delete myC;
return 0;
}
delete myC会自动释放myC的arr数组吗?还是需要编写C的析构函数来显式释放?
在C++类中, 默认析构函数会自动删除那些在代码中没有显式分配的成员吗?比如:
class C {
public:
C() {}
int arr[100];
};
int main(void) {
C* myC = new C();
delete myC;
return 0;
}
delete myC会自动释放myC的arr数组吗?还是需要编写C的析构函数来显式释放?
构造函数(在没有任何ctor-initializer-list的情况下),会为每个子对象调用默认构造函数。
由于您没有基类且成员变量是原始类型,所以构造函数不会有任何操作。
析构函数也是一样。如果您没有声明析构函数,它将隐式地由编译器生成,并对每个子对象调用析构函数。由于您的唯一子对象是一个原始数据类型的聚合体,因此这是微不足道的。
现在,当您删除类时,所有该类的内存都将被释放。由于数组嵌入在类内部,它是同一个内存区域的一部分,因此将在同时释放。
隐式定义的(默认)析构函数将调用每个成员的析构函数。在成员为数组的情况下,它将调用数组每个元素的析构函数。
请注意,指针没有析构函数;您需要手动删除它们。在提供的示例中,您没有这个问题,但这是需要注意的事项。
int::~int()
一样存在——这使得编写具有显式析构函数调用的模板代码成为可能(考虑std::vector<T*>::resize()
)。但是指针类型的析构函数什么也不做,就像你所说的int::~int()
一样,编译器知道这一点,并不会生成函数调用。 - Ben Voigt如果你的类/结构体包含一个指针,并且你显式地为该指针分配了一些内容,那么通常需要在析构函数中编写相应的delete
。直接嵌入到类/结构体中的成员将自动创建和销毁。
class X {
int x;
int *y;
public:
X() : y(new int) {}
~X() : { delete y; }
};
这里 X::x 将会自动创建/销毁。X::y(或者,严谨来说,是 X::y 所指向的内容)不会 -- 我们在构造函数中分配它,在析构函数中销毁它。
X::y
会自动销毁。如果没有析构函数,*(X::y)
将会泄漏。(而且你的示例违反了三五法则) - Ben Voigt任何你使用 new 命令创建的对象,都必须使用对应的 delete 命令进行删除。如果你没有使用 new 命令创建对象,那么就不需要使用 delete 命令。
delete
。相反,尝试为所有成员建立严格的所有权或成员语义,以便自动销毁可以解决问题。如果这种方法失败了,智能指针通常比手动指针和 delete
更好。 - Rawler你不必编写析构函数。C++类有默认的析构函数,在“return 0”后删除对象以回收内存。