我试图确定要在代码中放置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_ptrstd::weak_ptr的情况。普通代码不应使用新表达式或删除表达式。

关于c++ - 从typeid成功返回是否可以保证dynamic_cast不会引发异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22447917/

10-11 18:21