如何解决删除静态转换指针是否安全?
考虑抽象类 AbstractMap
和它的子类MyMap
。执行以下删除操作是否安全?或者,我应该在重新投射到 MyMap 后才删除 ptr 吗?为什么?我想这是不安全的,因为在这种情况下 MyMap
的析构函数没有被调用。
AbstractMaP* ptr;
ptr = static_cast<AbstractMaP*>(new MyMap());
delete ptr;
past question 谈到了强制转换为 void*
的情况,但我不确定我的情况。
解决方法
如果 AbstractMap
的(或它的基类,如果有的话)析构函数标记为 virtual
,delete ptr
将是明确定义的。
编译器将虚拟调用派生最多的析构函数(与任何虚拟函数一样),反过来,它会以非虚拟方式调用基类的析构函数。
析构函数将拥有调用所有成员对象的析构函数所需的所有代码,并且在此过程结束时,内存将被回收回堆管理器(基于分配块的大小)。
,考虑抽象类 AbstractMap 和它的子类 MyMap。 执行以下删除操作是否安全?
ptr = static_cast<AbstractMap*>(new MyMap());
delete ptr;
只有当基的析构函数(在本例中为 AbstractMap
)是虚拟的时,通过指向基子对象的指针删除才是安全的。如果不满足该前提条件,则程序的行为未定义。
假设 AbstractMap 有一个虚析构函数,它如何调用子类的析构函数?
请注意,如果您使用 allocating new 表达式创建实例,则不应直接调用析构函数。 delete
会为您做到这一点。
但是在您可能需要直接调用析构函数的特殊情况下,您可以通过使用动态调度(这是虚函数的默认调度形式)调用 AbstractMap
的析构函数来实现。
它怎么知道“原始”是MyMap?
您不需要知道动态类型。这就是虚拟函数如此出色的原因。
附言避免拥有裸指针。几乎不需要写 new
和 delete
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。