使用 dynamic_cast to 验证指向多态类型的指针
Use dynamic_cast to to validate pointer to polymorphic type
由于某些原因,在我们的应用程序中,我们可能会删除已删除的指针:
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->SomeMethod();
我知道这将是非常糟糕的解决方案,应该避免。
我的探索是:如果指向多态对象的指针无效,IsPointerValid是否总是返回false?
这是未定义的行为。
您需要了解的是,dynamic_cast
需要一个"有效"指针。即,指向"有效"对象的指针。
给定指向无效对象(不再存在的对象)的指针,这会导致未定义的行为。
有时你会在这里得到真实。有时你会得到错误。有时你会得到"找不到文件"作为返回值。这就是未定义行为的含义。
虽然搬到shared/weak_ptr
肯定会花费你很多时间,但解决问题并保证它不会回来,会让你付出代价
答:更多的时间;你总是会处于"我认为问题已经解决了"的状态,再也不会感到安全了。
B. 客户满意度,因为您不会覆盖 100% 的源代码。
我希望您在取消引用这些之前也有空指针检查。在这种情况下,将删除替换为宏 DELETE,这将调用真正的删除并将指针设置为 NULL。这将向以下软件发出信号,表明该对象已删除,不应使用。在我看来,在一个相对较大的项目中,这种更换也不应该花费大量精力。
- 对于多态类型T,如何在没有类型T实例的情况下获得指向T的虚拟表的指针
- 哈希多态类型的正确方式
- C++ 2D shared_ptr数组使用抽象多态类型初始化
- 一个类似 std::访问的函数,用于访问多态类型
- 将unique_ptr返回到多态类型
- 为什么删除的复制构造函数不允许使用其他具有多态类型的构造函数?
- Sean Parent:对于继承层次结构中的多态类型,具有可变对象是极端的例外
- 通过指向非多态类型的基类的指针获取已分配内存的地址
- 如何在代码块 IDE 上修复此警告,警告:按值 [-Wcatch-value=] 捕获多态类型"类 std::d omain_error"
- 不是多态类型,或者为什么我们在这里需要虚拟析构函数?
- 游戏引擎:Dynamic_cast-对象类不是多态类型
- 使用decltype的动态多态类型演绎
- 编译器如何知道为多态类型选择哪个函数
- 多态类型的连续存储
- 如何在gSOAP中绑定多态类型
- 防止谷物写入多态类型数据
- C++传递函数作为具有多态类型的参数
- 返回不带动态内存分配的多态类型
- 符合标准的编译器是否可以拒绝包含非多态类型向下转换dynamic_cast代码
- 在循环中使用无变量多态类型进行优化