混沌 IN C++::Exception思维

原创 2004年07月11日 21:20:00

难度:star.gifstar.gifstar.gifstar.gif

您的代码中有Exception吗?作为C++中最具争议的东西,就连在使用上也不是一件容易的事,您怎么看待异常呢?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

如果想判断一个对象是否构造成功,我们可以用以下的三种方法

1

struct A

{

A(int& i)

{

    //其他代码

    if(构造失败)

         i = 0;

     else

         i = 1;

}

};

 

int i;

A a(i);

if(i==0)

cout<<构造失败<<endl;

 

2

class A

{

public:

     A()

{

        //其他代码

        if(构造失败)

              isok_ = false;

        else

              isok_ = true;

}

bool isok() const

{  return isok_; }

private:

     bool isok_;

};

 

A a;

if(!a.isok())

     cout<<构造失败<<endl;

 

3

class my_exception: public std::exception{};

 

struct A

{

A()

{

    //其他代码

    if(构造失败)

        throw my_exception();

}

};

 

try

{

    A a;

}

catch(my_exception& ex)

{   cout<<构造失败<<endl; }

 

综观三种方法,我们来做个简单的分析。

第一种,该构造函数提供了一个用于返回错误的标志变量,虽然可以判断是否构造成功,但是这个多余的变量更像是一个累赘。

第二种,构造函数上没有歧义了。但是它并没有降低复杂度。更重要的是,它和第一种方法有个通病,那就是析构函数会被正常调用。换句话说,这样的对象构造失败并不是语言所支持的,而是程序员自己的逻辑规定。

第三种,这就完全没有上面两种方法的问题,在构造函数中抛出异常,就意味这这个对象未构造成功,这是被语言所支持的,这样一来,class A的析构函数将不会作用于对象a。这一特性可以让我们不再为这类安全性操心了。

 

在某些函数中,我们可以通过按值返回错误码,但在某些情况下这类方法并不顶用,这样我们就可以考虑异常。

 

从上面的表现来看,并没有体现出异常带来复杂度。但是,当遇到资源管理时,其中就有很多事情也许会被我们忽略。

void test()

{

int* p= new int;

//其他代码

    delete p;

}

 

如果中间的代码抛出异常,最好的情况就是内存泄露及带来不安全因素。我们应该加入异常处理

void test()

{

int *p =NULL;

try

{

    p = new int;

    //其他代码

}

catch(...)

{

    delete p;

    throw; //异常中立,保证了前一版本test函数的行为

}

    delete p;

}

但这也许并不算最爽的解决方案。我们可以利用RAII技巧。来简化这个操作

template<typename T>

class auto_new

{

public:

      auto_new():ptr_(NULL)

      {

           try

           {

                  ptr_ = new T;

           }

           catch(std::bad_alloc)

           {

    //异常处理

}

}

~auto_new()

{

    delete ptr_;

}

operator T*()

    {  return ptr_; }

private:

      T* prt_;

}

 

void test()

{

     auto_new<int> p;

     //其他的代码

}

这样就不用担心异常发生时带来的资源回收问题。当然,对于简单的资源,我们可以采用auto_ptr<>

也许各位看官会认为,这样的做法也并没有降低复杂度,似乎反而增大了工作量。是的,但是这样的代码可以使我们更放心。

 

异常也不是十全十美的,它自身也存在很多的缺陷,比如它的运行成本比较高,如果正常的控制结构可以处理错误,那么就不应该去使用异常。异常的一个作用就是当某个部分出现异常状况,那么我们可以通过异常来通知另一个部分。例如,当程序出现异常,那么我们可以把这个异常层层往上传递到函数的调用点,而其他的错误处理方式并不这么方便。虽然异常可以在两个部分进行传递,但是它并不是跨线程的,我们不能在两个线程间传递异常。例如下面的代码就是错误的

 

DWORD CALLBACK threadfunc(void*)

{

   //其他代码

   throw int();  //抛出异常

}

 

int main(){

    try

    {

        DWORD tid;

        HANDLE hdl = CreateThread(NULL, 0, &threadfunc, NULL, 0, &tid);

        Sleep(500);

        CloseHandle(hdl);

    }

    catch(...)

       {  cout<<"catched"<<endl;}

}

 

threadfunc抛出的异常我们根本无法接收到。这样也说明了一个问题,当我们不确定线程函数中的代码是否会抛出异常的时候,我们都必须在其中加入try 块,以保证异常安全。例如上面的代码就应该写成下面这个样

 

DWORD CALLBACK threadfunc(void*)

{

   try

   {

      //其他代码 //不确定这里是否会抛出异常

   }

   catch(...)

   {}

}

 

int main(){

     DWORD tid;

     HANDLE hdl = CreateThread(NULL, 0, &threadfunc, NULL, 0, &tid);

     Sleep(500);

     CloseHandle(hdl);

}

 

//The End

混沌方法的数字图像加密

Abstract:目前混沌系统与加密技术相结合是现如今最热门的一个课题,虽然有大量的加密算法面世,但是这些加密算法并不成熟,仍然需要进一步的研究。本文采用像素位置置乱变换和像素值替代变换相结合的加密思...
  • hlx371240
  • hlx371240
  • 2015年05月09日 20:01
  • 5079

混沌学

基本介绍   混沌是指发生在确定性系统中的貌似随机的不规则运动,一个确定性理论描述的系统,其行为却表现为不确定性--不可重复、不可预测,这就是混沌现象。进一步研究表明,混沌是非线性动力系统的固有特性...
  • bookaswine
  • bookaswine
  • 2012年08月05日 09:17
  • 2683

混沌时间序列的几个例子

混沌时间序列的例子:虫口模型、洛伦兹方程(天气预报模型)、CHne's吸引子 奇怪吸引子、吸引子 几个例子的MATLB程序,可以看到混沌序列的样子...
  • ldj1208
  • ldj1208
  • 2016年07月12日 23:01
  • 2034

混沌变换及Logistic映射

引言 : 混沌算法? 如果一个系统的演变过程对初始的状态十分敏感,就把这个系统称为是混沌系统。 在1972年12月29日,美国麻省理工教授、混沌学开创人之一E.N.洛仑兹在美国科学发展学...
  • askfuhu
  • askfuhu
  • 2011年10月19日 20:30
  • 7556

【图像加密】图像处理之Logistic混沌序列加密

Logistic混沌序列加密。
  • hujingshuang
  • hujingshuang
  • 2015年05月14日 10:54
  • 3791

Logistic混沌映射

Logistic混沌映射1 引言如果一个系统的演变过程对初始的状态十分敏感,就把这个系统称为是混沌系统。在1972年12月29日,美国麻省理工教授、混沌学开创人之一E.N.洛仑兹在美国科学发展学会第1...
  • qiluofei
  • qiluofei
  • 2007年10月22日 16:31
  • 6423

matlab做出分叉与混沌分支图

目前我理解的分叉与混沌为: 对于一个类似于xk+1=f(μ,xk+1)形式的迭代数列,当迭代若干次后,会随μ的取值不同出现不同的情况 ·1、所有点都聚集在一个点附近,或者在某个点不动 2、所有点...
  • cantjie
  • cantjie
  • 2017年06月01日 22:56
  • 894

混沌理论与分析

混沌理论与分析 摘要:随着科学的发展及人们对世界认识的深入,混沌理论越来越被人们看作是复杂系统的一个重要理论,它在各个行业的广泛应用也逐渐受到人们的青睐。本文给出了混沌的定义及其相关概念,论述了混沌...
  • qq_38736812
  • qq_38736812
  • 2018年01月20日 20:59
  • 70

大数据时代的数学思维(2)-混沌产生随机数

逻辑斯蒂映射的形式为 x_(n+1)=ax_n(1-x_n), 其中a是参数,当a>=3.569946时,x的值不再振荡,进入混沌,在此之前,x的值处于稳定状态,a值较小时,稳定在某个固定值,较大...
  • u010255642
  • u010255642
  • 2013年08月29日 10:52
  • 1733

【图像加密】图像处理之Logistic混沌置乱加密

Logistic混沌置乱加密:什么是位置置乱,顾名思义就是把图像中某一像素点的位置,移动到另一目的点。我们知道这个目的点当然是越随机越好。这个过程,所有像素的灰度值都没有改变,只是进行了位置的置乱,所...
  • hujingshuang
  • hujingshuang
  • 2015年05月14日 11:06
  • 3173
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:混沌 IN C++::Exception思维
举报原因:
原因补充:

(最多只允许输入30个字)