Ang*_*.47 0 c++ exception class delete-operator
最好从代码开始,以了解这一点
#include "Hello1.h"
#include "Hello2.h"
int main(int argc, char ** argv)
{
// Hello1 and Hello2 are derevied classes of Hello
// And there constructor throws an exception
Hello * h;
try
{
if (argv[1][0]=='1')
h = new Hello1;
else
h = new Hello2;
}
catch (std::exception ex) { /*print error*/ }
delete h;
}
Run Code Online (Sandbox Code Playgroud)
如果Hello1并Hello2抛出一个异常,它出现段错误.但是,如果我添加
Hello h = NULL;
Run Code Online (Sandbox Code Playgroud)
有用!!!
Hello是一个带有构造函数的类,它抛出异常
我能想到的只是构造函数中的异常从内存中删除了对象!为什么谁...谁解释!请.
但是,如果我添加
Hello h = NULL;它的工作!为什么谁...谁解释!请.
那是因为operator delete当指针是什么时什么都不做null.预计什么都不做,这是标准行为.C++ 11标准的第3.7.4.2段规定:
[...]提供给解除分配函数的第一个参数的值可以是空指针值; 如果是这样,并且如果解除分配功能是标准库中提供的功能,则该调用无效.[...]
null另一方面,如果不是,operator delete则会尝试删除指向的对象hello,并且由于指针未初始化(因为构造投掷和控制在分配hello发生之前被转移到异常处理程序),因此会得到未定义的行为.
根据第5.3.5/2段:
[...]在第一个替代(删除对象)中,操作数的值
delete可以是空指针值,指向由前一个新表达式创建的非数组对象的指针,或指向子对象的指针( 1.8)表示这种对象的基类(第10条).如果不是,则行为未定义.[...]