From 8fe37bdf630be1088d4df528550763c771c525dd Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 10 Jun 2016 19:25:07 +0100 Subject: [PATCH] Fixed memory leak --- src/osgPlugins/bsp/VBSPEntity.cpp | 16 ++++++++-------- src/osgPlugins/bsp/VBSPGeometry.h | 7 ++++--- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/osgPlugins/bsp/VBSPEntity.cpp b/src/osgPlugins/bsp/VBSPEntity.cpp index 443d12e55..1bb4873e1 100644 --- a/src/osgPlugins/bsp/VBSPEntity.cpp +++ b/src/osgPlugins/bsp/VBSPEntity.cpp @@ -369,7 +369,6 @@ ref_ptr VBSPEntity::createBrushGeometry() { int i; int numGeoms; - VBSPGeometry ** vbspGeomList; Model currentModel; Face currentFace; TexInfo currentTexInfo; @@ -387,11 +386,11 @@ ref_ptr VBSPEntity::createBrushGeometry() // convert them back into OSG geometry objects. We potentially will need // one for each state set in the map numGeoms = bsp_data->getNumStateSets(); - vbspGeomList = new VBSPGeometry *[numGeoms]; - // Initialize the list to all NULL for now. We'll create the geometry - // objects as we need them - memset(vbspGeomList, 0, sizeof(VBSPGeometry *) * numGeoms); + typedef std::vector< osg::ref_ptr > VBSPGeometryList; + + VBSPGeometryList vbspGeomList; + vbspGeomList.resize(numGeoms); // Get this entity's internal model from the bsp data currentModel = bsp_data->getModel(entity_model_index); @@ -435,12 +434,13 @@ ref_ptr VBSPEntity::createBrushGeometry() // Get or create the corresponding VBSPGeometry object from the // list currentGeomIndex = currentTexInfo.texdata_index; - currentGeom = vbspGeomList[currentGeomIndex]; + currentGeom = vbspGeomList[currentGeomIndex].get(); + if (currentGeom == NULL) { // Create the geometry object vbspGeomList[currentGeomIndex] = new VBSPGeometry(bsp_data); - currentGeom = vbspGeomList[currentGeomIndex]; + currentGeom = vbspGeomList[currentGeomIndex].get(); } // Add the face to the appropriate VBSPGeometry object @@ -484,7 +484,7 @@ ref_ptr VBSPEntity::createBrushGeometry() for (i = 0; i < numGeoms; i++) { // Get the next geometry object (if any) - currentGeom = vbspGeomList[i]; + currentGeom = vbspGeomList[i].get(); if (currentGeom != NULL) { // Convert the BSP geometry to OSG geometry diff --git a/src/osgPlugins/bsp/VBSPGeometry.h b/src/osgPlugins/bsp/VBSPGeometry.h index 367592faa..7a53ca3c2 100644 --- a/src/osgPlugins/bsp/VBSPGeometry.h +++ b/src/osgPlugins/bsp/VBSPGeometry.h @@ -13,7 +13,7 @@ namespace bsp { -class VBSPGeometry +class VBSPGeometry : public osg::Referenced { protected: @@ -37,10 +37,11 @@ class VBSPGeometry int firstVertex, int vertsPerEdge); void createDispSurface(Face & face, DisplaceInfo & dispInfo); - public: + virtual ~VBSPGeometry(); + +public: VBSPGeometry(VBSPData * bspData); - virtual ~VBSPGeometry(); void addFace(int faceIndex); osg::ref_ptr createGeometry();