【发布时间】:2012-03-25 09:23:11
【问题描述】:
我有一个下面提到的 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;
}
现在在函数 func() 中,我看到两种不同的行为,这取决于我是否没有将指针“pw”设置为 NULL 以及是否将“pw”指针设置为 NULL(如上面的代码)。我的印象是,首先将指针设置为 NULL 然后初始化它是“好”的做法。但是当我将它初始化为 NULL 时,输出只显示“In catch BLOCK”,然后应用程序崩溃。但是如果我没有将 pw 指针设置为 NULL,那么我会看到 pw 的析构函数被调用,并且以下输出显示为没有任何应用程序崩溃。
Widget的DtoR被调用
在捕获块中
OK 为 NULL
分配内存时出错。
按任意键继续。 . .
我的问题是为什么在一种情况下我们没有将“pw”指针初始化为 NULL,而在另一种情况下我们将其设置为 NULL。为什么在一种情况下调用析构函数而在另一种情况下不调用它。
注意:此代码的目的是抛出 bad_alloc 异常。
【问题讨论】: