首页 > 解决方案 > 删除静态转换指针是否安全?

问题描述

考虑抽象类AbstractMap,它是子类MyMap。执行以下删除操作是否安全?或者,我应该仅在重新投射到 MyMap 后删除 ptr 吗?为什么?MyMap我想这是不安全的,因为在这种情况下,没有调用析构函数。

AbstractMap* ptr;
ptr = static_cast<AbstractMap*>(new MyMap());
delete ptr;

过去的问题谈到了强制转换void*,但我不确定我的情况。

标签: c++pointersdynamic-caststatic-cast

解决方案


假设AbstractMap's (或它的基础,如果有的话)析构函数被标记为virtualdelete ptr将是明确定义的。

编译器将虚拟地调用派生最多的析构函数(与任何虚拟函数一样),而后者又会非虚拟地调用基类的析构函数。

析构函数将具有调用所有成员对象的析构函数的所有必要代码,并且在此过程结束时,内存将被回收回堆管理器(基于分配块的大小)。


推荐阅读