当构造函数抛出异常时,删除运算符段错误

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)

如果Hello1Hello2抛出一个异常,它出现段错误.但是,如果我添加

Hello h = NULL;
Run Code Online (Sandbox Code Playgroud)

有用!!!

Hello是一个带有构造函数的类,它抛出异常

我能想到的只是构造函数中的异常从内存中删除了对象!为什么谁...谁解释!请.

And*_*owl 6

但是,如果我添加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条).如果不是,则行为未定义.[...]