从构造函数引发异常-Core Dumped

Throwing an exception from a constructor - Core Dumped

本文关键字:-Core Dumped 异常 构造函数      更新时间:2023-10-16

这是我执行的代码:

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

因此,我的类是以指针作为参数构造的。如果这个指针是nullptr,我想抛出一个Invalid Argument异常。

总的来说,我有:

A* myAobject = new B(nullptr);

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

但我得到了:

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

如果我尝试:gdb/主要核心我得到:

Program terminated with signal SIGABRT, Aborted.
#0  0x00007fe14f81bcc9 in __GI_raise (sig=sig@entry=6) at     ../nptl/sysdeps/unix/sysv/linux/raise.c:56
56  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or   directory.
Traceback (most recent call last):
  File "/usr/share/gdb/auto-load/usr/lib/x86_64-linux-    gnu/libstdc++.so.6.0.19-gdb.py", line 63, in <module>
    from libstdcxx.v6.printers import register_libstdcxx_printers
ImportError: No module named 'libstdcxx'

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

您需要捕获异常:

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保持未初始化状态,从析构函数中删除它将导致seg错误。