使用dynamic_cast验证指向多态类型的指针

时间:2016-01-14 12:14:20

标签: c++ pointers casting

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

IPolymorphicObject* p_object = CreateObject();

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

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;
}

最终代码如下:

if(IsPointerValid(mp_object))   mp_object-&GT;的someMethod();

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

我的任务是:如果指向多态对象的指针无效, IsPointerValid 总会返回false吗?

3 个答案:

答案 0 :(得分:3)

这是未定义的行为。

您需要了解的是dynamic_cast需要&#34;有效&#34;指针。也就是说,指向&#34;有效&#34;对象

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

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

答案 1 :(得分:1)

虽然转移到shared/weak_ptr肯定会花费你很多时间,解决问题,并保证不会返回,但会花费你

一个。更多时间;你总是会在'我认为问题解决了'状态,并且再也不会感到安全了。

湾客户满意度,因为您不会涵盖100%的源代码。

答案 2 :(得分:-1)

我希望你在取消引用它们之前也有NULL指针检查。在这种情况下,用宏DELETE替换你的删除,它将调用实际删除并将指针设置为NULL。这将向跟随的软件发出信号,表示该对象已被删除且不应使用。在我看来,这种替代不应该在一个相对较大的项目中做出重大努力。