删除类型转换指针的最佳方法

时间:2017-05-24 15:35:47

标签: c++ memory-management

我已经创建了一个函数 释放一个人的记忆 指向基类的对象。

关于字段变量 对象可以是类型化的 到其中一个派生类 (DERA,DERB,DERC)。

删除的最佳做法是什么 对象。

delete object;
delete (DerA*)obj;
delete static_cast<DerA>(object)

或以上所有人都做同样的工作。

我的代码示例如

void deal(BaseClass *obj)
{
   if(obj)
   {
      switch(obj->m_id)
      {
         case DerivedAObj:
         {
             delete (DerA*)obj;
             break;
         }
         case DerivedBObj:
         {
             delete static_cast<DerA>(obj);
             break;
         }

      }
   }
}

1 个答案:

答案 0 :(得分:4)

解决方案是使析构函数成为虚拟的。这样,动态调度析构函数通过基指针调用,并运行正确的子类析构函数。不需要铸造。

  

删除对象的最佳做法是什么。

delete object;

这是最好的方式(显示的选项,请参阅下面的更好)。但它需要基础中的虚拟析构函数。

delete (DerA*)obj;

即使基础析构函数不是虚拟的,这也是正确的。有些人更喜欢static_cast<DerA*>(object),因为这更明确。两者都是等价的。

delete static_cast<DerA>(object)

您无法删除非指针。如果DerA可隐式转换为DerA*,则可能会有效。否则就是形成不良。

比任何选项都更好的是使用智能指针。如果您不需要共享所有权,并且析构函数是虚拟的,则可以使用std::unique_ptr<BaseClass>。当唯一指针超出范围时,指向的对象将自动销毁,而没有明确的delete

如果您需要共享所有权,或者析构函数不是虚拟的,则可以改为使用std::shared_ptr<BaseClass>