Term07: Declare destructors virtual in polymorphic base classes.
1.多态基类的析构函数应该声明为虚函数
以工厂模式为典型代表的应用场景下会有很多的基类指针指向派生类对象的情况,这是基于面向对象的多态特性的C++的应用。这样在使用delete指针来销毁对象的时候,就会出现调用了基类的析构函数而派生类的析构没有调用的情况,从而导致内存泄漏。将基类析构函数定义为虚函数可以使得对象销毁时调用到派生类的析构函数,编译器会在派生类的析构函数中调用基类的析构。
2.不会作为基类的类,或者不具备多态性的基类,不要将析构函数声明为虚函数
编译器对虚函数的实现是创建虚表,虚表包括一个虚表指针以及一个由函数指针组成的数组,因此会造成不必要的内存开销。所以不是多态基类的类不要将析构函数定义为虚函数。
Term08: Prevent exceptions from leaving destructors.
1. 不要让析构函数抛出异常
销毁一个容器的对象的时候,如果析构函数抛出异常,很有可能会发生这个容器的多个对象的析构同时抛出异常,这样会导致异常处理系统的紊乱,会使程序崩溃。解决这个问题的原则就是保证析构函数不抛出异常,如果析构函数内产生异常则需要自己消化。两种方式:
1)析构函数中检测到异常则立即停止程序运行。
2)析构函数中检测到异常只记录下异常,使程序继续顺利执行。
两种方式的选择根据业务需要来判定。
2. 如果类的使用者需要处理这个异常,将异常发生的可能性从析构函数中迁出到其他函数中
不存在一个方法,能避免析构函数抛出异常的危险性。也就是说为了处理这个异常,就需要把它从析构函数中迁出。将析构函数中可能发生异常的处理放到形如Destroy的方法中由使用者调用。既然使用者关注这个异常,他就有这个责任做这件事。