dynamic_casting后删除指针是否安全

Is it safe to delete the pointer after dynamic_casting?

本文关键字:指针 是否 安全 删除 casting dynamic      更新时间:2023-10-16
void foo(MyClass* myClass)
{
    BaseClass* pBaseClass = dynamic_cast<BaseClass*>(myClass);
    delete myClass;   // <-------------- Does this affects on pBaseClass ?
}

一般来说,dynamic_cast实际上是如何工作的?(它像复制构造函数一样工作吗?

不,不安全dynamic_cast只是一个类型转换 - 原始指针和转换后的指针都指向同一对象。

转换后的指针可能会指向略有不同的地址(如果涉及多重继承(,但它仍然指向(in(同一个对象 - 不会发生对象复制。

编辑:我的意思是"不安全"的意思是"在你delete myClass之后,pBaseClass是一个悬而未决的指针。不过,它仍然是法典。只是很危险。

(请注意,class不是有效的变量名,因为它是一个关键字。我把它叫做c(。

dynamic_casting后删除指针是否安全?

是的;但请注意,删除它们指向的对象后,这两个指针都无效。之后不能使用任一指针值。

一般来说,dynamic_cast实际上是如何工作的?

它将对类类型的指针或引用

转换为指向不同类类型的指针或引用,并在运行时检查转换是否有效。在这种情况下,如果BaseClass与对象的动态类型相同或基类,则强制转换将成功(提供有效的指针(。否则它将失败(给出空指针(。

如果将*c转换为引用类型,则失败将导致异常(std::bad_cast(,因为没有空引用这样的东西。

它像复制构造函数一样工作吗?

不。复制构造函数用于复制对象。这不是复制它,只是更改指向它的指针的类型。副本看起来像

BaseClass bc = *c;

注意,bc的类型是BaseClass,而不是c的类型(大概是从BaseClass派生的类(;这被称为"切片",因为对象的派生部分被"切掉"而不是复制。

由于您正在处理指针,因此仅复制指针的值(即,只是地址(。

这是对类似代码的体面解释

C++ 强制转换会创建新对象吗?