- 在constructors内阻止资源泄漏
针对数据成员是指针的类,如果你以auto_ptr对象来取代pointer class members ,你便可避免异常出现时发生资源泄漏的可能性,不需要在destructors内手动释放资源。
class BookEntry{
public:
...
private:
Image*const theImage;
AudioClip* const theaudioclip;
};
BookEntry::BookEntry(...):thename(name),theaddress(address),theImage(imageFileName!=" "?new Image(imageFileName):0),theAudioClip(audioClipFileName!=""?new AudioClip(audioClipFileName):0)//以成员初值列的方式初始化一个const指针
{
}
如果是普通类,就采用try…catch
class BookEntry{
public:
...
private:
...
void cleanup();
};
void BookEntey::cleanup(){
delete theImage;
delete theAudioClip;
}
BookEntry::BookEntry(...):thename(name),theaddress(address),theImage(0),theAudioClip(0){
try{
...
}
catch(...){
cleanup();//释放资源
throw;//c
}
}
BookEntry::~BookEntry(){
cleanup();//释放资源
}
- 全力阻止在destructor中传出异常
原因1:避免terminate函数在exception传播过程中的栈展开机制【如果控制权基于exception的原因离开destructor,此时如果有另一个exception处于作用状态,那么c++就会调用terminate函数】。原因2:确保destructor完成它该完成的所有事情