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



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

关于字段变量 对象可以类型化转换 到派生类之一 (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;
}
}
}
}

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


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

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>

相关内容

最新更新