在处理异常的时候 利用对象来管理资源来避免资源泄露
我们的程序可能在某一条语句抛出异常,导致其之后的代码没有被执行。这时候我们利用对象来管理资源,避免泄露,你可能会说利用try catch的形式,但是形式使我们的程序的复用性降低,并且可读性降低。利用对象来管理资源,如果抛出异常来的话,当程序离开其作用域析构函数就会被调用。避免资源泄露。
在构造函数内阻止资源泄露
构造函数尚未完成,C++不会调用内的析构函数,在构造函数中,如果可能发生异常,我们必须自己做好清理工作(避免资源泄露),利用try catch。这时候我们需要清理好资源后在抛出异常。所以说构造函数是可以抛出异常的,但是我们必须铭记析构函数不会被调用了,我们必须自己做好资源的清理工作。一个好的习惯是,对象内的资源,也也成员对象来管理。就不必担心资源的泄露问题了,一个简单的例子就是,如果一个类里面需要一个指针,那么这个成员指针,最好是智能指针。
禁止异常流出析构函数
首先明确析构函数被调用的两种情况:
1.对象在正常状态下被销毁也就是离开了它的生存空间或是被明确的删除。
2.当对象被异常处理机制也就是exception传播过程中的栈展开机制中被销毁。
我们不允许在析构函数中抛出异常,因为一个析构函数抛出异常的同时,很有可能有一个exception正在作用。同时产生两个异常,C++会调用terminate函数,这可能造成资源的泄露。这种情况尤其是我们在处理容器的时候很容易发生,所以我们绝不能让异常流出构造函数。另一个阻止异常流出析构函数的原因在于,可能析构函数还没有完成它的清理工作。