From 7b2b81ed54d63c1fdbee6d768538f499a8c81d25 Mon Sep 17 00:00:00 2001 From: jonasstrandstedt Date: Thu, 11 Dec 2014 10:13:10 +0100 Subject: [PATCH] Fix memory leaks and proper deinitialization --- include/openspace/rendering/renderabletrail.h | 2 +- include/openspace/rendering/stars/renderablestars.h | 3 ++- include/openspace/scripting/scriptengine.h | 3 ++- src/engine/gui.cpp | 3 ++- src/engine/openspaceengine.cpp | 1 + src/rendering/planets/renderableplanet.cpp | 5 +++-- src/rendering/renderabletrail.cpp | 8 +++++--- src/rendering/renderengine.cpp | 8 ++++++++ src/rendering/stars/renderablestars.cpp | 7 ++++++- src/scenegraph/scenegraphnode.cpp | 6 ++++-- src/scripting/scriptengine.cpp | 4 ++++ 11 files changed, 38 insertions(+), 12 deletions(-) diff --git a/include/openspace/rendering/renderabletrail.h b/include/openspace/rendering/renderabletrail.h index aa399d229f..7dfeacfdbe 100644 --- a/include/openspace/rendering/renderabletrail.h +++ b/include/openspace/rendering/renderabletrail.h @@ -87,7 +87,7 @@ public: //Vertex* _varray; std::vector _varray; - int* _iarray; + std::vector _iarray; //bool _once = false; double lightTime; diff --git a/include/openspace/rendering/stars/renderablestars.h b/include/openspace/rendering/stars/renderablestars.h index 87f027bf46..c94ce523b4 100644 --- a/include/openspace/rendering/stars/renderablestars.h +++ b/include/openspace/rendering/stars/renderablestars.h @@ -35,8 +35,9 @@ namespace openspace { class RenderableStars : public Renderable { -public: +public: RenderableStars(const ghoul::Dictionary& dictionary); + ~RenderableStars(); bool initialize() override; bool deinitialize() override; diff --git a/include/openspace/scripting/scriptengine.h b/include/openspace/scripting/scriptengine.h index 6a5c687d73..71d3765c3a 100644 --- a/include/openspace/scripting/scriptengine.h +++ b/include/openspace/scripting/scriptengine.h @@ -50,8 +50,9 @@ public: bool operator<(const LuaLibrary& rhs) const; }; - + ScriptEngine(); + ~ScriptEngine(); bool initialize(); void deinitialize(); diff --git a/src/engine/gui.cpp b/src/engine/gui.cpp index 4215bf3593..5de3254b65 100644 --- a/src/engine/gui.cpp +++ b/src/engine/gui.cpp @@ -337,7 +337,8 @@ void GUI::initializeGL() { } void GUI::deinitializeGL() { - delete _program; + if(_program) + delete _program; _program = nullptr; if (vao) glDeleteVertexArrays(1, &vao); diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 22ee63853e..4650984a0c 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -91,6 +91,7 @@ OpenSpaceEngine::OpenSpaceEngine(std::string programName) } OpenSpaceEngine::~OpenSpaceEngine() { + _gui.deinitializeGL(); if(_syncBuffer) delete _syncBuffer; _syncBuffer = nullptr; diff --git a/src/rendering/planets/renderableplanet.cpp b/src/rendering/planets/renderableplanet.cpp index 436a55f408..231660481f 100644 --- a/src/rendering/planets/renderableplanet.cpp +++ b/src/rendering/planets/renderableplanet.cpp @@ -86,10 +86,11 @@ RenderablePlanet::RenderablePlanet(const ghoul::Dictionary& dictionary) _colorTexturePath.onChange(std::bind(&RenderablePlanet::loadTexture, this)); } -RenderablePlanet::~RenderablePlanet() {} +RenderablePlanet::~RenderablePlanet() { + deinitialize(); +} bool RenderablePlanet::initialize() { - bool completeSuccess = true; if (_programObject == nullptr) OsEng.ref().configurationManager().getValue("pscShader", _programObject); diff --git a/src/rendering/renderabletrail.cpp b/src/rendering/renderabletrail.cpp index 4122d49d70..80bcef3627 100644 --- a/src/rendering/renderabletrail.cpp +++ b/src/rendering/renderabletrail.cpp @@ -117,7 +117,8 @@ void RenderableTrail::fullYearSweep(){ _isize = (segments + 2); _vsize = (segments + 2); - _iarray = new int[_isize]; + _iarray.clear(); + //_iarray = new int[_isize]; for (int i = 0; i < segments+2; i++){ SpiceManager::ref().getTargetState(_target, _observer, _frame, "LT+S", et, _pscpos, _pscvel, lightTime); @@ -138,7 +139,8 @@ void RenderableTrail::fullYearSweep(){ _varray.push_back(1.f ); _varray.push_back(1.f ); #endif - _iarray[i] = i; + //_iarray[i] = i; + _iarray.push_back(i); if (i != 0) //very first point needs to be alllocated twice. et -= _increment; } @@ -174,7 +176,7 @@ void RenderableTrail::sendToGPU(){ glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, st, (void*)(4 * sizeof(GLfloat))); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _iBufferID); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, _isize * sizeof(int), _iarray, GL_STATIC_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, _isize * sizeof(int), _iarray.data(), GL_STATIC_DRAW); glBindVertexArray(0); } diff --git a/src/rendering/renderengine.cpp b/src/rendering/renderengine.cpp index 04377df7a9..7aba6ebfda 100644 --- a/src/rendering/renderengine.cpp +++ b/src/rendering/renderengine.cpp @@ -142,6 +142,14 @@ RenderEngine::RenderEngine() RenderEngine::~RenderEngine() { + if(_abuffer) + delete _abuffer; + _abuffer = nullptr; + + if(_sceneGraph) + delete _sceneGraph; + _sceneGraph = nullptr; + delete _mainCamera; if (_visualizer) delete _visualizer; diff --git a/src/rendering/stars/renderablestars.cpp b/src/rendering/stars/renderablestars.cpp index d49179f35d..bfb913f3d3 100644 --- a/src/rendering/stars/renderablestars.cpp +++ b/src/rendering/stars/renderablestars.cpp @@ -121,6 +121,10 @@ RenderableStars::RenderableStars(const ghoul::Dictionary& dictionary) _colorTexturePath.onChange([&]{ _colorTextureIsDirty = true; }); } +RenderableStars::~RenderableStars() { + deinitialize(); +} + bool RenderableStars::isReady() const { return (_program != nullptr) && (_fullData.size() > 0); } @@ -150,7 +154,8 @@ bool RenderableStars::deinitialize() { delete _pointSpreadFunctionTexture; _pointSpreadFunctionTexture = nullptr; - delete _program; + if(_program) + delete _program; _program = nullptr; return true; } diff --git a/src/scenegraph/scenegraphnode.cpp b/src/scenegraph/scenegraphnode.cpp index e83d8acc2d..092dc9ffbb 100644 --- a/src/scenegraph/scenegraphnode.cpp +++ b/src/scenegraph/scenegraphnode.cpp @@ -153,9 +153,11 @@ bool SceneGraphNode::deinitialize() { LDEBUG("Deinitialize: " << name()); - delete _renderable; + if(_renderable) + delete _renderable; _renderable = nullptr; - delete _ephemeris; + if(_ephemeris) + delete _ephemeris; _ephemeris = nullptr; // deallocate the child nodes and delete them, iterate c++11 style diff --git a/src/scripting/scriptengine.cpp b/src/scripting/scriptengine.cpp index 767016ec69..ecf18a9aa8 100644 --- a/src/scripting/scriptengine.cpp +++ b/src/scripting/scriptengine.cpp @@ -182,6 +182,10 @@ ScriptEngine::ScriptEngine() { } +ScriptEngine::~ScriptEngine() { + deinitialize(); +} + bool ScriptEngine::initialize() { LDEBUG("Adding base functions"); addBaseLibrary();