2016-01-07 2 views
0

Это код, который я выполняю:Бросив исключение из конструктора - Core сбрасывали

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 ./main core.main я получаю:

Program terminated with signal SIGABRT, Aborted. 
#0 0x00007fe14f81bcc9 in __GI_raise ([email protected]=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' 

Я не понимаю, почему ... Могли бы вы пожалуйста помогите?

ответ

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 остается uninitalized, удаляя его из деструктора будет сег.

+0

Я уверен, что созданные объекты были разрушены? По-видимому, деструкторы не вызываются ... –

+3

@aky - Объекты никогда не были полностью построены из-за исключения. Таким образом, нет никакого объекта для разрушения. –

Смежные вопросы