我是C ++的新手,我正在理解的一个概念是析构函数。出于好奇,可以不必要(例如,当一个类没有动态分配的内存,资源或任何需要用户定义的析构函数的东西时)和空的析构函数会导致任何不可预见的问题吗?
编辑:我知道Will an 'empty' constructor or destructor do the same thing as the generated one?已经回答了部分内容,但我想扩大它,以便更多地了解广泛的负面后果,例如崩溃或使应用程序变慢。有一些重叠,但问题略有不同。
答案 0 :(得分:4)
问题取决于几个参数。空虚不是影响结果的唯一因素。例如,如果你没有定义virtual
析构函数(空或不是),那么从类继承时你会遇到问题。另一方面,如果在private
或protected
部分中定义一个空的析构函数,它将阻止在堆栈上创建类的实例。
答案 1 :(得分:4)
还有一个有趣的方面(在链接副本中似乎没有被讨论过)一小部分析构函数。编译器生成的(或default
ed)析构函数被认为是琐碎的析构函数,并且具有简单的析构函数是您的类是POD类型的先决条件。用户定义的析构函数即使为空,也会阻止您的类成为POD类型。
拥有POD类型有时非常重要。例如,POD类型可以是memcpy
或实体序列化的。
答案 2 :(得分:1)
不,在析构函数运行后,实例的所有成员仍然被销毁。析构函数唯一不能做的就是抛出一个异常,否则它可以做任何“正确”方法可以做的事情,也就是说什么都不做就好了。你不应该关闭句柄是另一个问题。
答案 3 :(得分:0)
没有。实际上,如果你没有为类或结构声明和编写析构函数,编译器会为你做 - 而且它将是空的。
答案 4 :(得分:0)
"空的析构函数"有点用词不当。无论你的析构函数是否有正文,编译器仍然会生成代码,以声明的相反顺序调用每个非静态成员变量和基类的析构函数。如果你想在其他析构函数被调用之前做某事,你只需要一个正文。