这是我执行的代码:
'<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)
我不明白为什么......你能帮助我吗?
答案 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
仍然未被初始化,则从析构函数中删除它将会出错。