c++ - 从具有基类 ptr 的 vector 中删除

标签 c++ vector multiple-inheritance erase

我在物理模拟中使用了一个名为 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 )。但是你确实需要调用deletevector 中的每个指针上打电话前 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/

相关文章:

C++ 虚表查询

android - 我如何在android中添加填充矢量文件

c++ - Dlib:如何初始化一个忽略标志设置为 1 的 mmod_rect?

C++多级继承

c++ - 非常基本的 C++ 程序中的意外输出

c++ - 快速排序的 C++ 实现中的运行时错误

c++ - 不会为所有 thread_local 对象调用析构函数

c++ - 如何有效地从 vector 中删除重复的用户定义数据?

c++ - 如果直接从 QObject 派生,使用*虚拟*多重继承是否安全?

c++ - 继承QSerialPort