다음 코드가 메모리 누수로부터 안전한지 확실하지 않습니다.순수 가상 함수 소멸자가있는 다형성 C++
#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
위의 "인터페이스"는 object3d.cpp에 의해 구현되었습니다. 그런 다음 동일한 Scene에 속한 경우 많은 Object3D 객체를 Scene 객체에 추가 할 수 있습니다. 그러나 장면이 끝나면 메모리 누수가 없는지 확인하여 모든 항목에서 delete를 호출합니다. 그러나, 장면 객체에, 나는 다음과 같은 변수가 있습니다
QVector<Renderable*>* sceneObjects;
QVector<GLTexture2D*>* sceneTextures;
QMap<QString, Material*>* sceneMaterials;
당신이 볼 수 있듯이을
delete sceneObjects;
delete sceneTextures;
delete sceneMaterials;
QVector와 Qt는에 따르면, 그 개체의 소멸자를 호출해야 삭제해야 그것. 그러나 Qt 문서는 객체 포인터에 대해 명확하지 않았습니다. Qt는 적절한 소멸자가있는 객체 포인터를 삭제합니까? 또한 Renderable 포인터는 어떻게됩니까? "인터페이스"에서 볼 수 있듯이 소멸자가 없습니다.
입력 해 주셔서 감사합니다. 파생 객체에 대한 기본 포인터에 delete
를 호출하면 정의되지 않은 동작 하나하지 않고 있기 때문에 모든 ChaoSXDemon
그래서 소멸자도 순수 가상이어야합니다. – ChaoSXDemon
@ChaoSXDemon은 순수 가상이 아니며 가상입니다. 순수하게 가상으로 만들 수는 있지만, 아무런 의미가 없기 때문에 어쨌든 정의가 있어야합니다. –
Renderable을 사용하는 w/e 객체의 경우 올바른 소 거기를 호출하도록 구현 객체에 무엇을 써야합니까? – ChaoSXDemon