我试图确定要在代码中放置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.
}
}
最佳答案
如果basePtr
是指向已删除对象的指针,则使用该悬空指针值进行任何操作都不是“安全的”或定义明确的。 typeid(*basePtr)
和dynamic_cast<T*>(basePtr)
都是未定义的行为,这意味着情况比引起异常更糟:您的程序可能崩溃,可能做错了事情或可能工作了数年然后突然中断。
如果您需要了解对象的销毁,这听起来像std::shared_ptr
或std::weak_ptr
的情况。普通代码不应使用新表达式或删除表达式。
关于c++ - 从typeid成功返回是否可以保证dynamic_cast不会引发异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22447917/