C++ 从typeid成功返回是否保证dynamic#u cast赢了';你不会抛出异常吗?

C++ 从typeid成功返回是否保证dynamic#u cast赢了';你不会抛出异常吗?,c++,dynamic-cast,typeid,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

我正在尝试决定我的代码中要放置多少个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);
      }
   }
}

如果
basePtr
是指向已删除对象的指针,则使用该悬空指针值执行任何操作都不是“安全的”或定义良好的
typeid(*basePtr)
dynamic_cast(basePtr)
都是未定义的行为,这意味着情况比引发异常更糟:您的程序可能会崩溃,可能会做错误的事情,或者可能会工作多年然后突然中断


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

不幸的是,由于应用程序的要求,我不能使用std::shared_ptr或std::weak_ptr。真正的解决方案是当
基类型
被删除时,客户端通知
控制器
。我正试图找出如何检测这些缺陷并尽可能优雅地处理它们。事实上,
typeid(*p)
p
所指的类型不是多态性时总是可以的,因为标准说在这种情况下它是未评估的(所以它就像
sizeof(*p)
)。但是据std讨论邮件列表上的人说,当类型是多态的时,这是一种未定义的行为,原因很明显---实现必须在运行时检查对象的类型。@Brian,你是说使用
typeid(*p)
,其中
p
是指向多态类型的指针,将导致未定义的行为?使“其中
p
是指向已删除的多态类型的指针”。如果无法使用
std::weak_ptr
,是否可以修改析构函数
~BasePtr
void bar(BaseType* basePtr)
{
   DerivedType* dTypePtr = NULL;
   try
   {
      dTypePtr = dynamic_cast<DerivedType*>(basePtr);
   }
   catch(...)
   {
      // Drop the exception.
   }

   if ( NULL != dTypePtr )
   {
      // Do stuff.
   }
}