删除静态指针是否安全?

Is it safe to delete static casted pointer?

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

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

past question 谈到了转换为 void* 的情况,但我不确定我的情况。

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

编译器将虚拟调用派生程度最高的析构函数(与任何虚函数一样),而这又将非虚拟地调用基类的析构函数。

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

Consider abstract class AbstractMap and it's child classMyMap. Is it safe to perform the following delete operation?

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

只有当基类的析构函数(AbstractMap 在这种情况下)是虚拟的时,通过指向基类子对象的指针进行删除才是安全的。如果不满足该先决条件,则程序的行为未定义。

Suppoes AbstractMap has a virtual destructor, how can it call the child class's destructor?

请注意,如果您使用分配新表达式创建实例,则不应直接调用析构函数。 delete 会为你做到这一点。

但在特殊情况下,您可能需要直接调用析构函数,您可以通过使用动态调度(这是虚函数的默认调度形式)调用 AbstractMap 的析构函数来实现。

how can it know that the "original" one is MyMap?

你不需要知道动态类型。这就是虚函数如此出色的原因。


P.S。避免拥有裸指针。几乎不需要写 newdelete.