具有纯虚函数析构函数的多态C++

Cha*_*mon 1 c++ qt

我不确定以下代码是否可以防止内存泄漏.

#ifndef RENDERABLE_H
#define RENDERABLE_H

class QGLShaderProgram;
class GLWidget;
class BoundingBox;

class Renderable{

public:
    virtual void update(float duration) = 0;
    virtual void render(QGLShaderProgram& shader, float duration) = 0;
    virtual BoundingBox* getBBox() const = 0;
    virtual void translate(float xx, float yy, float zz) = 0;
    virtual void rotate(float degrees_x, float degrees_y, float degrees_z) = 0;
    virtual void scale(float xx, float yy, float zz) = 0;
};

#endif // RENDERABLE_H
Run Code Online (Sandbox Code Playgroud)

上面的"接口"由object3d.cpp实现.然后,如果它们属于同一场景,我​​们可以将许多Object3D对象添加到Scene对象中.但是,在场景结束时,我想确保没有内存泄漏,因此我会在所有内容上调用delete.但是,在scene对象中,我有以下变量:

QVector<Renderable*>* sceneObjects;
QVector<GLTexture2D*>* sceneTextures;
QMap<QString, Material*>* sceneMaterials;
Run Code Online (Sandbox Code Playgroud)

如你看到的,

delete sceneObjects;
delete sceneTextures;
delete sceneMaterials;
Run Code Online (Sandbox Code Playgroud)

应该删除QVector并根据Qt,它应该调用其中的那些对象的析构函数.但是,Qt文档并不清楚对象POINTERS.Qt会用正确的析构函数删除对象指针吗?另外,可渲染指针会发生什么?正如您从"界面"中看到的那样,它没有析构函数.

感谢您的任何意见.ChaoSXDemon

Set*_*gie 5

首先,您的Renderable类必须具有虚拟析构函数,因为调用delete派生对象的基指针是没有定义的未定义行为.

第二,不,你需要循环并调用delete每个指针(或者,正如Nikos所说,qDeleteAll只要容器中的每个对象都在每个容器中分配普通new(而不是new[]malloc其他任何东西))以确保他们的内存被回收了(Qt怎么知道指针指向分配的内容new?他们可以指向由new[]堆,堆栈或其他地方分配的东西).

如果您不想这样做,可以将unique_ptrs 存储在容器中,然后在容器unique_ptr中调用s 的析构函数delete,这些析构函数将释放它们拥有的内存.无需手动解除分配或使用qDeleteAll.