为什么C++对象有一个默认的析构函数?
例如,当我没有声明构造函数时,编译器将为我提供一个没有参数和定义(空体)的默认构造函数,因此不会采取任何操作。
那么,例如,如果我完成了一个对象,默认的析构函数不会重新分配(释放)该对象使用的内存吗?如果它没有,为什么我们会得到它?而且,可能同样的问题也适用于默认构造函数。如果它什么也不做,为什么默认情况下会为我们创建它?
解决方案
说编译器生成的默认构造函数不执行任何操作是错误的。它相当于一个具有空主体和空初始化器列表的用户定义构造函数,但这并不意味着它不执行任何操作。以下是它的功能:
- 它调用基类的默认构造函数。
- 如果类是多态的,则它初始化vtable指针。
- 它调用所有成员的默认构造函数。如果某个成员具有一些构造函数,但没有默认构造函数,则这是编译时错误。
只有当类不是多态的,没有基类,也没有需要构造的成员时,编译器生成的默认构造函数才不执行任何操作。但即便如此,出于其他答案中解释的原因,默认构造函数有时也是必要的。
析构函数也是如此-它调用基类的析构函数和所有拥有它们的成员的析构函数,所以在一般情况下,编译器生成的析构函数不做任何事情是不正确的。
但内存分配实际上与此无关。内存是在调用构造函数之前分配的,并且只有在最后一个析构函数完成之后才会释放。
相关文章