删除静态指针是否安全?
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
的(或者它的基础,如果有的话)析构函数被标记为 virtual
,delete 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。避免拥有裸指针。几乎不需要写 new
和 delete
.
考虑抽象 class AbstractMap
及其子 classMyMap
。执行以下删除操作是否安全?或者,我应该只在重新投射到 MyMap 后才删除 ptr 吗?为什么?我猜这是不安全的,因为在这种情况下 MyMap
的析构函数没有被调用。
AbstractMap* ptr;
ptr = static_cast<AbstractMap*>(new MyMap());
delete ptr;
past question 谈到了转换为 void*
的情况,但我不确定我的情况。
如果 AbstractMap
的(或者它的基础,如果有的话)析构函数被标记为 virtual
,delete 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。避免拥有裸指针。几乎不需要写 new
和 delete
.