异常处理

异常处理


简历稳定的系统

为了防止资源泄露, 用以下两种方式来防止 “不成熟的” 的资源分配
1.  在构造函数中捕获异常,用于释放资源。
2. 在对象的构造函数中分配资源, 并且在析构函数中释放资源


以下代码是不成熟的分配方式,  极易造成问题:
#include "stdafx.h"
#include <iostream>
#include <cstddef>

using namespace std;

class Cat
{
public:
Cat()
{
cout<<"Cat()"<<endl;
}

~Cat()
{
cout<<"~Cat()"<<endl;
}

void g() {}
};

class Dog
{
public:
// 重载new 运算符
void* operator new[] (size_t)
{
cout<<"Allocating a Dog"<<endl;
throw 47;
}

// 重载delete运算符
void operator delete[] (void* p)
{
cout<<"Deallocating a Dog"<<endl;
::operator delete[] (p);
}
};

class UseResources
{
Cat*  cats;
Dog* dog;

public:
UseResources(int count = 1)
{
cout<<"UseResources()"<<endl;
cats = new Cat[count];
dog  = new Dog;
}

~UseResources()
{
cout<<"~UseResource()"<<endl;
delete [] cats;
delete Dog;
}
};


int _tmain(int argc, _TCHAR* argv[])
{
try
{
UseResources ur(3);
}
catch(int)
{
cout<<"inside handler"<<endl;
}
catch(...)
{
cout<<"inside catch(....)"<<endl;
}
system("pause");
return 0;
}




程序的输出结果是:

UseResources()
Cat()
Cat()
Cat()
allocating a Dog
inside handler

程序执行到UserResources构造函数中, Cat的构造函数成功的完成数组对象中的三个对象,然而在  Dog::operator new()
函数中抛出一个异常。   程序执行异常处理器之时突然中止,UseResources的析构函数没有被调用。这是正确的,
但是 UseResources 的构造函数没有完成, 这说明在堆上的Cat对象是不会被销毁的。


为了防止资源泄露, 用以下两种方式来防止 “不成熟的” 的资源分配
1.  在构造函数中捕获异常,用于释放资源。
2. 在对象的构造函数中分配资源, 并且在析构函数中释放资源
#include  "stdafx.h"
#include  <iostream>
#include  <cstddef>


//  在构造中分配资源
template < class  T, int sz = 1>
class   PWrap
{
        T *   ptr   ;

public :
        class   RangeError   {};
        PWrap ()
     {
             //   在构造中分配资源
             ptr   =   new   T [   sz ];
             cout << "PWrap constructor"   << endl ;
     }
     ~   PWrap ()
     {
             //   在析构中释放资源
             delete   []   ptr   ;
             cout << "PWrap destructor"   << endl ;
     }

        T &   operator   []( int   i )   throw   ( RangeError )
     {
             //   返回下标的引用值
             if ( i   >= 0 &&   i   <   sz )
                 return   ptr   [ i ];

             throw   RangeError   ();
     }
};

class   Cat
{
public :
        Cat ()
     {
             cout << "Cat()"   << endl ;
     }

     ~   Cat ()
     {
             cout << "~Cat()"   << endl ;
     }

        void   g   () {}
};

class   Dog
{
public :
        void *   operator   new [] (   size_t )
     {
             cout << "Allocating a Dog"   << endl ;
             throw   47;
     }

        void   operator   delete [] (   void *   p   )
     {
             cout << "Deallocating a Dog"   << endl ;
          ::   operator   delete   [] ( p );
     }
};

class   UseResources
{
        PWrap < Cat   , 3>   cats ;
        PWrap < Dog   >      dog ;

public :
        UseResources ()
     {
             cout << "UseResources()"   << endl ;
     }

     ~   UseResources ()
     {
             cout << "~UseResource()"   << endl ;
     }

        void   f   ()
     {
             cats [1]. g   ();
     }
};


int   _tmain   ( int   argc ,   _TCHAR   *   argv [])
{
        try
     {
             UseResources   ur   ;
     }
        catch ( int   )
     {
             cout << "inside handler"   << endl ;
     }
        catch (...)
     {
             cout << "inside catch(....)"   << endl ;
     }
     
        system ( "pause"   );
        return   0;
}
  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值