我在物理模拟中使用了一个名为 Circle 的类。
圆声明如下:
class Circle : public IPhysics,
public IRenderable
{
...
}
圆被创建,然后使用它们的 IRenderable 指针存储在一个 vector 中,如下所示:
Circle* pC = new Circle(
mass,
vec2( vCircles[x]._x, vCircles[x]._y ), // position
vec2(0.0f, 0.0f), // velocity
vec2(0.0f, -g_kGRAVITY), // acceleration
_ClientCfg.rGridSquareSideLen * 0.1f, // radius
colour, colour // colour, motion colour
);
if( pC != nullptr )
streamed_circles.push_back(dynamic_cast<IRenderable*>(pC));
渲染完成后,它们会像这样从后台缓冲区中删除:
std::vector<IRenderable*> _pbkBuffer;
...
_pBkBuffer->erase( _pBkBuffer->begin(), _pBkBuffer->end() );
此删除导致内存泄漏。
为了从后台缓冲区 vector 中删除对象,我是否必须首先将它们转换回它们的叶类类型(例如 Circle 类型或其他叶类类型?)
编辑: 我在想我需要这样的东西:
std::for_each(
_pBkBuffer->begin() + _nStaticRenderables, _pBkBuffer->end(),
[]( IRenderable* p )
{
if( typeid(*p) == typeid(Circle) )
{
Circle* pC = dynamic_cast<Circle*>(p);
delete pC;
}
}
);
谢谢
最佳答案
您不必将它们转换回 Circle *
(假设 IRenderable
的析构函数是 virtual
)。但是你确实需要调用delete
在 vector
中的每个指针上打电话前 vector::erase
.
更好的选择是更改 std::vector<IRenderable*> _pbkBuffer;
至 std::vector<std::unique_ptr<IRenderable>> _pbkBuffer;
.现在打电话erase
不应泄漏任何内存。
注意:
streamed_circles.push_back(dynamic_cast<IRenderable*>(pC));
dynamic_cast
以上是不必要的; pC
可隐式转换为 IRenderable *
.
关于c++ - 从具有基类 ptr 的 vector 中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16327401/