首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在dynamic_casting之后删除指针安全吗?

在dynamic_casting之后删除指针安全吗?
EN

Stack Overflow用户
提问于 2013-11-20 15:44:17
回答 3查看 3.8K关注 0票数 8
代码语言:javascript
复制
void foo(MyClass* myClass)
{
    BaseClass* pBaseClass = dynamic_cast<BaseClass*>(myClass);
    delete myClass;   // <-------------- Does this affects on pBaseClass ?
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-20 15:52:57

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

在dynamic_casting之后删除指针安全吗?

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

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

它通过运行时检查转换是否有效,将指向类类型的指针或引用转换为指针或引用。在这种情况下,如果BaseClass与对象的动态类型相同或属于该对象的基类,则转换将成功(提供一个有效指针)。否则它将失败(提供一个空指针)。

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

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

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

代码语言:javascript
复制
BaseClass bc = *c;

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

票数 6
EN

Stack Overflow用户

发布于 2013-11-20 15:46:22

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

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

编辑:,我的意思是“不安全”,意思是“在你delete myClass之后,pBaseClass是一个悬空的指针。”不过,这仍然是法律法规。只是相当危险。

票数 7
EN

Stack Overflow用户

发布于 2013-11-20 16:20:16

因为您处理的是指针,所以只复制指针的值(即地址)。

下面是对类似代码的一个很好的解释

C++ Does casting create a new object?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20100360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档