c – 在dynamic_casting之后删除指针是否安全?

前端之家收集整理的这篇文章主要介绍了c – 在dynamic_casting之后删除指针是否安全?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
void foo(MyClass* myClass)
{
    BaseClass* pBaseClass = dynamic_cast<BaseClass*>(myClass);
    delete myClass;   // <-------------- Does this affects on pBaseClass ?
}

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

解决方法

(注意,类不是有效的变量名,因为它是一个关键字.我将其称为c).

Is it safe to delete the pointer after dynamic_casting?

是;但请注意,删除指向的对象后,两个指针都无效.之后您不能使用任何指针值.

In general how dynamic_cast actually works?

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

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

does it work like a copy constructor?

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

BaseClass bc = *c;

注意,bc的类型是BaseClass,而不是c的类型(可以推测从BaseClass派生的类);这被称为“切片”,因为对象的派生部分是“切掉”而不是复制.

猜你在找的C&C++相关文章