对异常处理的C++编程实践的困惑

Man*_*kla 2 c++ exception-handling

我有一个下面提到的C++代码:

#include<iostream>
#include<stdexcept>

const long MAX = 10240000;

class Widget{
      public:
             Widget(){
                      ok = new int [1024];
                      prob = new int [100*MAX];
             }
             ~Widget(){
                       std::cout<<"\nDtoR of Widget is called\n";
                       delete ok; ok = NULL;
                       delete prob; prob = NULL;
             }
             //keeping below public: Intentionally
              int* ok;
              int* prob;
};


void func(){
    Widget* pw = NULL;  // <<<<--------------- Issue in Here
    try{
        pw = new Widget;
    }
    catch(...){
               delete pw;
               std::cout<<"\nIn catch BLOCK\n";
               if(pw->ok == NULL){
                      std::cout<<"\n OK is NULL\n";
               }
               throw;
    }
    delete pw;
}

int main(){
    try{
          func();
    }
    catch(std::bad_alloc&){
                     std::cout<<"\nError allocating memory."<<std::endl;
    }

    std::cout<<std::endl;
    system("pause");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在在函数func()中,我看到两种不同的行为,具体取决于我是否将指针'pw'设置为NULL,如果我将'pw'指针设置为NULL(如上面的代码).我的印象是,首先将指针设置为NULL然后初始化它是"好"的做法.但是当我将它初始化为NULL时,输出只显示"In catch BLOCK",之后应用程序崩溃.但是如果我没有将pw指针设置为NULL,那么我会看到pw的析构函数被调用,并且显示以下输出没有任何应用程序崩溃.

调用Widget的DtoR

在赶上BLOCK

OK为NULL

分配内存时出错.

按任意键继续 ...

我的问题是为什么在我们没有将'pw'指针初始化为NULL而在另一种情况下我们将其设置为NULL时,这种差异.为什么在一个案例中调用析构函数,为什么不在另一个案例中调用析构函数.

注意:此代码的目的是抛出bad_alloc exeption.

小智 6

如果你没有设置pwNULL那么你将保持未初始化.然后,当new"try"块中的运算符抛出异常时,它永远不会返回,并且您进入catch阻塞状态.由于new从未返回,pw仍将未初始化,并且您将传递一个随机地址delete.这会给你一个未定义的行为.

  • 不要忘了提到删除后他正在做(pw-> ok) (3认同)