gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:07:31 31 4
gpt4 key购买 nike

我正在尝试决定在我的代码中有多少地方要放置 try/catch block 。

我有以下功能。

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 .普通代码不应使用 new 表达式或 delete 表达式。

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

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com