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

时间:2013-11-20 15:44:18

标签: c++ pointers memory-management casting dynamic-cast

void foo(MyClass* myClass)
{
    BaseClass* pBaseClass = dynamic_cast<BaseClass*>(myClass);
    delete myClass;   // <-------------- Does this affects on pBaseClass ?
}

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

3 个答案:

答案 0 :(得分:7)

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

转换后的指针可能指向稍微不同的地址(如果涉及多个继承),但它仍指向(内)到同一对象 - 不会发生对象复制。

编辑:我的意思是“不安全”,意思是“在你delete myClass之后,pBaseClass是一个悬空指针。”不过,它仍然是合法代码。非常危险。

答案 1 :(得分:6)

(请注意,class不是有效的变量名称,因为它是关键字。我将其称为c

  

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

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

  

一般来说,dynamic_cast的实际效果如何?

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

如果您将*c强制转换为引用类型,则失败会导致异常(std::bad_cast),因为不存在空引用。

  

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

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

BaseClass bc = *c;

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

答案 2 :(得分:0)

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

这是类似代码的合适解释

C++ Does casting create a new object?