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

Kos*_*asA 0 c++ memory-management

我创建了一个函数,该函数可以解除分配指向基类的对象的内存。

关于字段变量,可以将对象类型转换为派生类之一(DerA,DerB,DerC)。

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

delete object;
delete (DerA*)obj;
delete static_cast<DerA>(object)
Run Code Online (Sandbox Code Playgroud)

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

我的代码示例如下所示

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

      }
   }
}
Run Code Online (Sandbox Code Playgroud)

eer*_*ika 5

一种解决方案是使析构函数虚拟化。这样,通过基指针进行的析构函数调用将被动态分派,并且将运行正确的子类析构函数。无需铸造。


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

delete object;
Run Code Online (Sandbox Code Playgroud)

这是最好的方法(在显示的选项中,请参见下面的内容)。但这需要在基层中使用虚拟析构函数。

delete (DerA*)obj;
Run Code Online (Sandbox Code Playgroud)

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

delete static_cast<DerA>(object)
Run Code Online (Sandbox Code Playgroud)

您不能删除非指针。如果DerA可以隐式转换为,这可能会起作用DerA*。否则,它的格式不正确。


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

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