c++ - 使用 dynamic_cast 来验证指向多态类型的指针

标签 c++ pointers casting

由于某些原因,在我们的应用程序中,我们可能拥有已被删除的指针:

IPolymorphicObject* p_object = CreateObject();

某处 p_object 将被删除(通过 delete 或卸载分配它的模块)

delete p_type;

另一个使用 p_object 保存值的代码,让它成为 mp_object

mp_object->SomeMethod();

因为 mp_object 已经被删除 - 我们遇到了崩溃。 我知道最好的方法是切换到 shared_ptr/weak_ptr,但现在它需要大量重构,这就是为什么我找到了另一个解决方案——如何检查指针有效性。

我知道 dynamic_cast 将返回指向内存中实际对象偏移量的指针。

我也知道 dynamic_cast(p_invalid_pointer) 会抛出异常 non_rtti_object 我可以捕捉到我因此编写验证方法:

template<class T>
bool IsPointerValid(T* ip_ptr)
{
try
{
dynamic_cast<void*>(ip_ptr);
}
catch(...)
{
return false;
}

return true;
}

最终代码如下:

如果(IsPointerValid(mp_object)) mp_object->SomeMethod();

我知道这将是非常糟糕的解决方案,应该避免。

我的问题是:如果指向多态对象的指针无效,IsPointerValid 是否总是返回 false?

最佳答案

这是未定义的行为。

您需要了解的是,dynamic_cast 需要一个“有效”指针。即,指向“有效”对象的指针。

给定一个指向无效对象的指针,一个不再存在的对象,这会导致未定义的行为。

有时候你会在这里得到真实的。有时你会弄错。有时你会得到 "File Not Found"作为返回值。这就是未定义行为的含义。

关于c++ - 使用 dynamic_cast 来验证指向多态类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34789364/

相关文章:

c++ - 如何合并多个点云构建3D map ?

c++ - 如何在不调用现有对象的析构函数的情况下在 vector 中添加和初始化对象?

c++ - 以编程方式重新启动所有崩溃服务的服务程序

c++ - 如何删除 MS Word 加载项按钮?

c++ - 类方法返回指向具有模板的类成员的指针

c - 取消引用指针会破坏它的值(value)?

c++ - 在 C++ 中返回局部变量的引用和标准指针的替代方法是什么?

C中变量的条件转换

java - 用Java将对象强制转换为long

mysql - SQL 查询中的 CONVERT 或 CAST 字段