从构造函数中抛出异常 - Core Dumped

时间:2016-01-07 19:41:24

标签: c++ core

这是我执行的代码:

'<array>.<index>'

所以,我的类是以指针作为参数构造的。如果这个指针是nullptr我想抛出一个无效的参数异常。

主要是我:

B::B(Ptr* myPtr)
    : A( myPtr!=nullptr ? myPtr->someFunction()
                        : throw std::invalid_argument("Invalid_argument") )
    , localPtr_(myPtr)
{}

所以,我期望编译器抛出异常,然后调用创建的对象的析构函数。

但我明白了:

A* myAobject = new B(nullptr);

并且,如果我尝试:gdb ./main core.main 我明白了:

terminate called after throwing an instance of 'std::invalid_argument'
  what():  Invalid_argument
Aborted (core dumped)

我不明白为什么......你能帮助我吗?

1 个答案:

答案 0 :(得分:1)

您需要捕获异常:

try
{
    A* myAobject = new B(nullptr);
}
catch (std::invalid_argument& e)
{
    // do something, exception was thrown...
}

请注意,在这种情况下不会调用A析构函数,因为该对象实际上从未完全创建。在此测试:http://cpp.sh/7fmr

调用析构函数是不安全的,请参阅此示例:

class B
{
public:
    B( bool param ) : m_b1( (param) ? new int() : throw std::runtime_error("")
    {
        m_b2 = new int();
    }
    ~B()
    {
        delete m_b1;
        delete m_b2;
    }
};

如果在构造函数抛出异常时调用析构函数,m_b2仍然未被初始化,则从析构函数中删除它将会出错。