我已经创建了一个函数 释放一个人的记忆 指向基类的对象。
关于字段变量 对象可以是类型化的 到其中一个派生类 (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;
}
}
}
}
答案 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>
。