Din*_*han 6 c++ pointers memory-management dynamic-cast casting
void foo(MyClass* myClass)
{
BaseClass* pBaseClass = dynamic_cast<BaseClass*>(myClass);
delete myClass; // <-------------- Does this affects on pBaseClass ?
}
Run Code Online (Sandbox Code Playgroud)
总的来说dynamic_cast实际上有多少?(它是否像复制构造函数一样工作?)
不,这是不是安全的.dynamic_cast只是一种类型转换 - 原始指针和转换指针都指向同一个对象.
转换后的指针可能指向稍微不同的地址(如果涉及多个继承),但它仍指向(内)到同一对象 - 不会发生对象复制.
编辑:我的意思是"不安全",意思是"在你之后delete myClass,pBaseClass是一个悬垂的指针".不过,它仍然是合法代码.太危险了.
(注意,这class不是一个有效的变量名,因为它是一个关键字.我会c改为称之为).
在dynamic_casting之后删除指针是否安全?
是; 但请注意,删除指向的对象后,两个指针都无效.之后您不能使用任何指针值.
一般来说dynamic_cast实际上是如何工作的?
它将指针或对类类型的引用转换为指针或对不同类类型的引用,并通过运行时检查转换是否有效.在这种情况下,如果BaseClass与对象的动态类型相同或者是基类,则转换将成功(给出有效指针).否则它将失败(给出空指针).
如果你要转换*c为引用类型,那么失败会导致异常(std::bad_cast),因为没有null引用这样的东西.
它是否像复制构造函数一样工作?
不可以.复制构造函数用于复制对象.这不是复制它,只是改变指向它的指针的类型.副本看起来像
BaseClass bc = *c;
Run Code Online (Sandbox Code Playgroud)
注意,类型bc是BaseClass,而不是类型c(可以推测一个类来源BaseClass); 这被称为"切片",因为对象的派生部分是"切掉"而不是复制.