物理シミュレーションで使用される Circle というクラスがあります。
円は次のように宣言されます。
class Circle : public IPhysics,
public IRenderable
{
...
}
円が作成され、次のように IRenderable ポインターを使用してベクターに格納されます。
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() );
この削除により、メモリ リークが発生しています。
バック バッファ ベクトルからオブジェクトを消去するには、最初にそれらをリーフ クラス タイプにキャストし直す必要がありますか (例: Circle タイプまたは他のリーフ クラス タイプ?)
編集:次のようなものが必要だと考えています:
std::for_each(
_pBkBuffer->begin() + _nStaticRenderables, _pBkBuffer->end(),
[]( IRenderable* p )
{
if( typeid(*p) == typeid(Circle) )
{
Circle* pC = dynamic_cast<Circle*>(p);
delete pC;
}
}
);
ありがとう