0

物理シミュレーションで使用される 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;
        }
    }
);

ありがとう

4

2 に答える 2

3

それらをキャストして戻す必要はありませんCircle *(のデストラクタがIRenderableisであると仮定しますvirtual)。ただし、 を呼び出す前deleteに、各ポインターを呼び出す必要があります。vectorvector::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 *です。

于 2013-05-01T22:26:25.013 に答える
1

ベクターからアイテムを削除する前にアイテムを呼び出す必要がありdeleteます。そうしないと、アイテムへの参照が失われますがvector、内部表現の唯一の管理メモリとしてメモリは削除されません (何もしないデストラクタを呼び出しますIRenderable*)。

std::vector<IRenderable*> _pbkBuffer;

for (size_t i = 0; i < _pbkBuffer.size(); i++) {
    delete _pbkBuffer[i];
}
_pbkBuffer.clear();

そうしないと、のデストラクタIRenderableが機能しないことを確認する必要があります。virtualdelete

dynamic_cast<IRenderable*>(pC)また、要素を に追加するときには必要ありませんvector。型システムで下向き (クラスから継承クラス) にキャストするだけdynamic_castでよく、上向き (クラスからその基底クラス) にキャストする必要はありません。

于 2013-05-01T22:25:24.837 に答える