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
如果你没有设置pw为NULL那么你将保持未初始化.然后,当new"try"块中的运算符抛出异常时,它永远不会返回,并且您进入catch阻塞状态.由于new从未返回,pw仍将未初始化,并且您将传递一个随机地址delete.这会给你一个未定义的行为.
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |