我正在尝试确定我的代码中有多少个地方要放置try / catch块。
我有以下功能。
void bar(BaseType* basePtr)
{
DerivedType* dTypePtr = dynamic_cast<DerivedType*>(basePtr);
if ( NULL != dTypePtr )
{
// Do stuff.
}
}
void Controller::foo()
{
std::vector<BaseType*>::iterator iter = this->bList.begin();
std::vector<BaseType*>::iterator end = this->bList.end();
for ( ; iter != end; ++iter )
{
BaseType* basePtr = *iter;
bool isObjectOK = true;
// Check whether an object has been deleted without
// notifying us.
// If we can get the typeid of the object, chances are that
// it has not been deleted.
try
{
int const* typeName = typeid(*basePtr).name();
}
catch(...)
{
isObjectOK = false;
}
if ( isObjectOK )
{
bar(basePtr);
}
}
}
如果我可以从typeid(*basePtr).name()
成功获取值,我可以安全地假设dynamic_cast<DerivedType*>(basePtr)
不会抛出异常吗?如果没有,我必须将bar
修改为:
void bar(BaseType* basePtr)
{
DerivedType* dTypePtr = NULL;
try
{
dTypePtr = dynamic_cast<DerivedType*>(basePtr);
}
catch(...)
{
// Drop the exception.
}
if ( NULL != dTypePtr )
{
// Do stuff.
}
}
答案 0 :(得分:2)
如果basePtr
是指向已被删除的对象的指针,那么对于悬挂指针值做任何事情都不是“安全”或定义良好的。 typeid(*basePtr)
和dynamic_cast<T*>(basePtr)
都是未定义的行为,这意味着情况比导致异常更糟糕:您的程序可能崩溃,可能做错了,或者可能看起来工作多年然后突然中断。 / p>
如果您需要了解对象的销毁情况,这听起来像std::shared_ptr
或std::weak_ptr
。普通代码不应使用新表达式或删除表达式。