Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类构造函数中异常处理的行为_C++_Exception Handling - Fatal编程技术网

C++ 类构造函数中异常处理的行为

C++ 类构造函数中异常处理的行为,c++,exception-handling,C++,Exception Handling,我有一个程序,其中派生类的构造函数抛出一个异常。这个程序只是一个示例程序,我只是想了解异常处理的概念 class A{ public: A() {} ~A(){std::cout << "DTOR called - A!!" << std::endl;} }; class B : public A { public: B():A() { try { init(); } catch

我有一个程序,其中派生类的构造函数抛出一个异常。这个程序只是一个示例程序,我只是想了解异常处理的概念

class A{
public:
   A() {}

   ~A(){std::cout << "DTOR called - A!!" << std::endl;}
};

class B : public A
{
public:
   B():A()
   {
      try
      {
         init();
      }
      catch(...)
      {
         std::cout << "Inside catch block in B's Ctor!!" << std::endl;
         throw this;
      }
   }

   void init() { throw 0;  }

   ~B() {std::cout << "DTOR called - B!!" << std::endl; }
};

int main()
{
   try{
      B *b = new B;

      std::cout << "Äfter B's ctor called in try block!!" << std::endl;
      delete b;
      std::cout << "Äfter B's dtor called in try block!!" << std::endl;
   }

   catch(B* b)
   {
      delete b;
      b = NULL;
      std::cout << "Exception Occurred in B!!" << std::endl;
   }

   catch(A* a)
   {
      delete a;
      a = NULL;
      std::cout << "Exception Occurred in A!!" << std::endl;
   }

   catch(...)
   {
      std::cout << "Exception Occured!!" << std::endl;
   }
   return EXIT_SUCCESS;
}
我这里的问题是,为什么类A的dtor只进入类B的catch块并只调用类B的dtor时调用了两次?? 如果我在这里犯了什么错误,也请告诉我。 谢谢你的帮助

编辑:

B类:公共A类
{
公众:
B():A()
{
尝试
{
szName=新字符[100];
init();
}
捕获(…)
{

std::cout你为什么要把“这个”扔进你的捕猎区?你在做“这个”的时候已经吐了,那么你怎么能把它扔掉呢?试着把你抓到的东西扔掉,或者其他什么东西,比如“哎呀”.

不要抛出
:捕获异常时,失败的对象不再存在。它已被清除,析构函数调用其成员和基类,并且其内存由异常处理机制自动释放。再次尝试删除它是错误的

只需像从任何其他函数中一样抛出一个正常的异常类型(最好是
std::exception
的子类型)。

之所以调用两次
~a()
,是因为在
B()
的主体内,
a()
已完全初始化,因此当发生异常时,
~a()将自动调用,而<代码>()(<代码)>本身尚未完全初始化,因此<代码> ~b](<代码)>将不被调用,并且如果构造函数抛出,则不需要也不应该删除指针,C++将在这种情况下调用“代码>删除<代码> >参见.< /p> < p > 1)b*b=新b;

已完成A级施工

B类建筑不完整

2) 扔这个

它将释放类A部分,因此会调用~A(),不会调用~B(),因为它的构造不完整

3) 控件转到catch(B*B)

删除b


调用~B然后调用~A

我抛出“this”,因为否则将导致内存泄漏。如何删除分配给“B”的内存那么??没有问题,除非您在抛出之前已经在构造函数中分配了其他内容。@Saurabhola:
new
如果构造函数抛出,则自动释放它分配的内存。无需自己尝试。请参阅
Inside catch block in B's Ctor!!
DTOR called - A!!
DTOR called - B!!
DTOR called - A!!
Exception Occurred in B!!
class B : public A
{
public:
   B():A()
   {
      try
      {
         szName = new char[100];
         init();
      }
      catch(...)
      {
         std::cout << "Inside catch block in B's Ctor!!" << std::endl;
         throw this;
      }
   }

   void init() { throw 0;  }

   ~B()
   {
      delete szName;
      std::cout << "DTOR called - B!!" << std::endl;
   }

   char *szName;
};