从typeid成功返回是否保证dynamic_cast不会抛出异常?

时间:2014-03-17 06:05:18

标签: c++ dynamic-cast typeid

我正在尝试确定我的代码中有多少个地方要放置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.
   }
}

1 个答案:

答案 0 :(得分:2)

如果basePtr是指向已被删除的对象的指针,那么对于悬挂指针值做任何事情都不是“安全”或定义良好的。 typeid(*basePtr)dynamic_cast<T*>(basePtr)都是未定义的行为,这意味着情况比导致异常更糟糕:您的程序可能崩溃,可能做错了,或者可能看起来工作多年然后突然中断。 / p>

如果您需要了解对象的销毁情况,这听起来像std::shared_ptrstd::weak_ptr。普通代码不应使用新表达式或删除表达式。