【c++语言特性-面试必考点】第七篇:异常(二)

本文探讨了如何在C++中防止资源泄漏,特别是在构造函数和析构函数中。通过使用智能指针如`auto_ptr`,可以在异常发生时自动管理资源释放。对于普通类,可以使用try...catch块并在析构函数中添加清理代码以确保资源始终被正确释放。此外,强调了防止析构函数中抛出异常的重要性,因为这可能导致程序终止并破坏栈展开机制。
摘要由CSDN通过智能技术生成
  1. 在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();//释放资源
}
  1. 全力阻止在destructor中传出异常

原因1:避免terminate函数在exception传播过程中的栈展开机制【如果控制权基于exception的原因离开destructor,此时如果有另一个exception处于作用状态,那么c++就会调用terminate函数】。原因2:确保destructor完成它该完成的所有事情

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值