C++ 从typeid成功返回是否保证dynamic#u cast赢了';你不会抛出异常吗?
我正在尝试决定我的代码中要放置多少个try/catch块 我有以下功能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
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.
}
}