ACG狂人

其实我更爱姐汁...

异常处理的可恶陷阱

也许这个错误是很幼稚的,但是他着实难住了我好几个小时,一度我还以为永远解不开这个谜题了(*o*),情况是这样的,异常在抛出之后,到达处理异常的catch域,但这时上下文必须依然有效才行,否则catch将接收不到抛出的异常。具体代码如下:
    try
    
{
        moeutil::simple_pool spool(
32);
        
void* p1 = spool.malloc(15);
        
void* p2 = spool.malloc(102);
        
void* p3 = spool.malloc(154);
        
void* p4 = spool.malloc(7);
        
void* p5 = spool.malloc(7);
        
void* p6 = spool.malloc(70);
        
//std::cout<<p1<<'\n'<<p2<<'\n'<<p3<<'\n'<<p4<<'\n'<<p5<<'\n'<<p6<<std::endl;
        spool.free(p1);
        spool.free(reinterpret_cast
<char*>(p2)+2);
        spool.free(p3);
        spool.free(p4);
        spool.free(p5);
        spool.free(p6);

    }
catch (moeutil::Exception& e){
        std::cout
<<e.what()<<std::endl;
    }
这是一个简易的内存池类,其中simple_pool的析构函数会抛出异常,然后free函数也会抛出异常。析构函数可以检测是否有内存泄漏,而free函数是检测到无效的传入指针时会抛出异常。析构抛出异常是没问题的,但是free抛出异常的时候问题就来了,当free抛出异常时,由于会脱离try块,所以spool也会被析构,这样就会陷入麻烦,由于没有全部free,所以析构本身也会抛出异常,导致了类似于异常迭代的情况。也就是说,在throw一个异常的过程中又一次触发了异常。于是windows系统的debug error对话框出现了,而且是出现在throw那一行。
此随笔用于提醒自己勿犯第二次!

posted on 2009-08-02 17:12 酿妹汁 阅读(557) 评论(1)  编辑 收藏 引用 所属分类: C++备忘

评论

# re: 异常处理的可恶陷阱[未登录] 2009-09-07 23:12 K

规范上一般不建议在析构函数里抛异常的吧~  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理