请稍侯

记一道尴尬的面试题

17 July 2017

在一个地方待久了,总会有些不安分的想法,碰巧在涛哥的推荐下,去到了一家Startup公司参加了一次面试,具体公司是啥就不说了,里面的研发人员还是很强大的,都是十几年的老猴子了。所以除了CPP部分,嗯,都被吊打了。紧张是一方面,主要原因还是最近松懈了很多,写下这篇文章一方面是吐槽那道题有点莫名其妙,另外一方面确实也是为了警醒自己。

CPP中一个类什么时候需要定义一个析构函数

其实这道题,我现在看起来简直觉得有些可笑,毕竟这道题是从题目来说就是错的,然而当时脑子一抽,居然还没想到点子上,嗯,我比这道题还可笑。为什么是错的,因为CPP的一个类不管什么情况下都会有一个析构函数,或手动定义,或编译器自动给你定义。我一下子听到这道题的时候脑子抽也就抽在这里了,老裴我掐指一算,觉得事情并不简单。所以这道题应该到底是想问什么呢?我事后想想,大概是想问什么时候需要手动定义一个析构函数吧。但是我之后想要找面试官确认一下,人家大概觉得我是个傻逼,根本就没有理我,真鸡儿丢人。

析构函数的作用以及手动定义的必要性

所以我这里大概就只能靠我自己的猜测来解答一下这道题了,所以什么时候一定需要手动定义一个析构函数呢,这要我们从析构函数的作用来讨论。简单来说析构函数的作用有两个:

  1. 在类型实例销毁的时候被调用,不管你是栈对象还是堆对象还是全局对象,在对象被销毁的时候肯定是会掉用你的析构函数的,这种时候是否要定义析构函数取决于要不要依靠这种方式来释放你申请的资源,如果你不指望依赖析构函数来释放你申请的资源,那么定义不定义完全没有什么差别。所以这里其实缺少了必要性,毕竟你可以依赖延迟释放那种方式从而使得你的析构函数什么也不干,除非你要实现RAII语义。

  2. 调用其父类型的析构函数,如果你要实现继承链,那么手动去定义一个析构函数还是有必要的,但是也限于你要使用多态的情况,其他情况下,依旧并不必要。

结论

综上所述,我觉得这道题的答案应该是,当你需要实现RAII语义或者你的继承链中某一个类手动定义了析构函数并且具有一些自定义行为的时候,你才有必要手动去定义一个析构函数。但是,实际写代码的时候哪有那么复杂,定义就好了!