Dynamic_cast 相同类型的对象
Dynamic_cast object to the same type
我正在处理一些遗留代码,其中包含如下几行:
try
{
object = dynamic_cast< Object* >( _object );
}
其中 _object
已经是 Object*
开头。如果 _object
已被释放,代码中有一条关于尝试避免崩溃的注释。我的问题是,如果它起作用,它是如何起作用的?如果开始和结束类型相同,dynamic_cast
还会做一些事情吗?
还有另一个地方他们也在做同样的事情 dynamic_cast
但它不在 try 块中。动态转换为完全相同的类型是否有任何意义,或者可能只是 "bad" 代码?
My question is, how does this work, if it does?
它没有,至少没有以任何明确定义的方式。尝试对已销毁的非平凡对象做任何事情都会产生未定义的行为。
在某些特定的实现中,如果对象被销毁,转换可能会完全失败。但它很可能崩溃或订购披萨。
有多种方法可以确保对象在使用前有效 - 例如智能指针或结构良好的范围 - 但测试对象本身(无论是通过 RTTI 还是用户声明的成员数据)都不起作用,因为销毁后无法安全地访问对象。
Does dynamic_cast
still do something if the start and end types are the same?
它可能什么都不做,因为它可以假设指针是有效的,因此转换会成功。或者它可能会进行 运行 次类型检查,如果指针有效则检查成功,否则会给出未定义的行为。
Could there be any point to a dynamic cast to the same exact type or is that likely just "bad" code?
不,没有意义。指针已经指向正确类型的有效对象,在这种情况下您可以直接使用它;或者没有,在这种情况下 dynamic_cast
未定义。
dynamic_cast 通常会在试图投射的对象已被释放时抛出异常。这可能就是他们所说的 "Avoiding a crash"
我认为他们把它扔到一个 try 块中是因为它之前崩溃了,他们不想弄清楚为什么它会在这里崩溃。
也没有理由动态转换为完全相同的类型,除非您尝试向变量添加常量(认为 const 是说明符而不是我认为的类型的一部分)。
我正在处理一些遗留代码,其中包含如下几行:
try
{
object = dynamic_cast< Object* >( _object );
}
其中 _object
已经是 Object*
开头。如果 _object
已被释放,代码中有一条关于尝试避免崩溃的注释。我的问题是,如果它起作用,它是如何起作用的?如果开始和结束类型相同,dynamic_cast
还会做一些事情吗?
还有另一个地方他们也在做同样的事情 dynamic_cast
但它不在 try 块中。动态转换为完全相同的类型是否有任何意义,或者可能只是 "bad" 代码?
My question is, how does this work, if it does?
它没有,至少没有以任何明确定义的方式。尝试对已销毁的非平凡对象做任何事情都会产生未定义的行为。
在某些特定的实现中,如果对象被销毁,转换可能会完全失败。但它很可能崩溃或订购披萨。
有多种方法可以确保对象在使用前有效 - 例如智能指针或结构良好的范围 - 但测试对象本身(无论是通过 RTTI 还是用户声明的成员数据)都不起作用,因为销毁后无法安全地访问对象。
Does
dynamic_cast
still do something if the start and end types are the same?
它可能什么都不做,因为它可以假设指针是有效的,因此转换会成功。或者它可能会进行 运行 次类型检查,如果指针有效则检查成功,否则会给出未定义的行为。
Could there be any point to a dynamic cast to the same exact type or is that likely just "bad" code?
不,没有意义。指针已经指向正确类型的有效对象,在这种情况下您可以直接使用它;或者没有,在这种情况下 dynamic_cast
未定义。
dynamic_cast 通常会在试图投射的对象已被释放时抛出异常。这可能就是他们所说的 "Avoiding a crash"
我认为他们把它扔到一个 try 块中是因为它之前崩溃了,他们不想弄清楚为什么它会在这里崩溃。
也没有理由动态转换为完全相同的类型,除非您尝试向变量添加常量(认为 const 是说明符而不是我认为的类型的一部分)。