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)
一种解决方案是使析构函数虚拟化。这样,通过基指针进行的析构函数调用将被动态分派,并且将运行正确的子类析构函数。无需铸造。
删除对象的最佳做法是什么。
Run Code Online (Sandbox Code Playgroud)delete object;
这是最好的方法(在显示的选项中,请参见下面的内容)。但这需要在基层中使用虚拟析构函数。
Run Code Online (Sandbox Code Playgroud)delete (DerA*)obj;
即使基本析构函数不是虚拟的,这也是正确的。有些人更喜欢,static_cast<DerA*>(object)因为这更加明确。两者是等效的。
Run Code Online (Sandbox Code Playgroud)delete static_cast<DerA>(object)
您不能删除非指针。如果DerA可以隐式转换为,这可能会起作用DerA*。否则,它的格式不正确。
比任何选择都更好的是使用智能指针。当您不需要共享所有权且析构函数为虚拟时,可以使用std::unique_ptr<BaseClass>。当唯一指针超出范围时,指向的对象将自动销毁,而无需使用explicit delete。
如果需要共享所有权,或者析构函数不能是虚拟的,则可以使用std::shared_ptr<BaseClass>。
| 归档时间: |
|
| 查看次数: |
509 次 |
| 最近记录: |