From 6d7a0461600a740c685e728f8303660f7b19e5ed Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 15 Sep 2004 15:09:46 +0000 Subject: [PATCH] Added usage of std::vector<> and ref_ptr<>'s to avoid memory leaks --- src/osgPlugins/txp/TXPParser.cpp | 42 +++++++++++++++----------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/src/osgPlugins/txp/TXPParser.cpp b/src/osgPlugins/txp/TXPParser.cpp index 4b9b7885b..a8da756f2 100644 --- a/src/osgPlugins/txp/TXPParser.cpp +++ b/src/osgPlugins/txp/TXPParser.cpp @@ -1115,20 +1115,19 @@ void* geomRead::Parse(trpgToken /*tok*/,trpgReadBuffer &buf) geom.GetNumNormal(numNorm); // Get vertices - osg::Vec3Array* vertices = new osg::Vec3Array(numVert); + osg::ref_ptr vertices = new osg::Vec3Array(numVert); geom.GetVertices((float *)&(vertices->front())); // Turn the trpgGeometry into something osg can understand - osg::Geometry *geometry = 0L; + osg::ref_ptr geometry; // Get texture coordinates ; int num_tex; geom.GetNumTexCoordSets(num_tex); - osg::Vec2Array** tex_coords = new osg::Vec2Array*[num_tex]; + std::vector< osg::ref_ptr > tex_coords(num_tex); for (int texno = 0; texno < num_tex; texno++) { - tex_coords[texno] = 0L; const trpgTexData* td = geom.GetTexCoordSet(texno); if (td) { @@ -1144,7 +1143,7 @@ void* geomRead::Parse(trpgToken /*tok*/,trpgReadBuffer &buf) } // The normals - osg::Vec3Array* normals = 0L; + osg::ref_ptr normals; if (numNorm == numVert) { normals = new osg::Vec3Array(numVert); @@ -1196,12 +1195,12 @@ void* geomRead::Parse(trpgToken /*tok*/,trpgReadBuffer &buf) std::swap((*vertices)[start], (*vertices)[end]); for(int texno = 0; texno < num_tex; texno ++ ) { - if( tex_coords[texno] ) + if( tex_coords[texno].valid() ) { std::swap((*tex_coords[texno])[start], (*tex_coords[texno])[end]); } } - if(normals) + if(normals.valid()) { std::swap((*normals)[start], (*normals)[end]); } @@ -1221,17 +1220,17 @@ void* geomRead::Parse(trpgToken /*tok*/,trpgReadBuffer &buf) // Is this geode group GeodeGroup *geodeTop = dynamic_cast(top); - if (geometry && top) + if (geometry.valid() && top) { // added this set use display list off since terrapage will // be creating and deleting these geometry leaves on the fly // so we don't want to be creating short lived display lists either. geometry->setUseDisplayList(false); - geometry->setVertexArray(vertices); - if (normals) + geometry->setVertexArray(vertices.get()); + if (normals.valid()) { - geometry->setNormalArray(normals); + geometry->setNormalArray(normals.get()); geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX); } @@ -1267,11 +1266,11 @@ void* geomRead::Parse(trpgToken /*tok*/,trpgReadBuffer &buf) sset = tmp_ss; } - if (tex_coords) + if (!tex_coords.empty()) { for (int texno = 0; texno < num_tex; texno++) { - geometry->setTexCoordArray( texno, tex_coords[texno]); + geometry->setTexCoordArray( texno, tex_coords[texno].get()); } } @@ -1282,7 +1281,7 @@ void* geomRead::Parse(trpgToken /*tok*/,trpgReadBuffer &buf) TXPParser::TXPBillboardInfo info; _parse->getLastBillboardInfo(info); - osg::Billboard* billboard = new osg::Billboard; + osg::ref_ptr billboard = new osg::Billboard; billboard->setAxis(osg::Vec3(0.0f,0.0,1.0f) ); billboard->setNormal(osg::Vec3(0.0f,-1.0,0.0f)); @@ -1317,7 +1316,7 @@ void* geomRead::Parse(trpgToken /*tok*/,trpgReadBuffer &buf) geometry->accept(tf); geometry->dirtyBound(); - billboard->addDrawable(geometry); + billboard->addDrawable(geometry.get()); billboard->setPosition(0, center); } break; @@ -1333,17 +1332,17 @@ void* geomRead::Parse(trpgToken /*tok*/,trpgReadBuffer &buf) geometry->accept(tf); geometry->dirtyBound(); - billboard->addDrawable(geometry); + billboard->addDrawable(geometry.get()); billboard->setPosition(0, center); } break; default: - billboard->addDrawable(geometry); + billboard->addDrawable(geometry.get()); osg::notify(osg::WARN) << "TerraPage loader: fell through case: " << __FILE__ << " " << __LINE__ << ".\n"; break; } - top->addChild(billboard); + top->addChild(billboard.get()); } else if (_parse->underLayerSubgraph()) @@ -1367,20 +1366,20 @@ void* geomRead::Parse(trpgToken /*tok*/,trpgReadBuffer &buf) geometry->setStateSet(sset.get()); } - layer->addDrawable(geometry); + layer->addDrawable(geometry.get()); } else { geometry->setStateSet(sset.get()); if (geodeTop) { - geodeTop->getGeode()->addDrawable(geometry); + geodeTop->getGeode()->addDrawable(geometry.get()); _parse->setCurrentNode(geodeTop->getGeode()); } else { osg::Geode* geode = new osg::Geode; - geode->addDrawable(geometry); + geode->addDrawable(geometry.get()); _parse->setCurrentNode(geode); _parse->getCurrTop()->addChild(geode); @@ -1394,7 +1393,6 @@ void* geomRead::Parse(trpgToken /*tok*/,trpgReadBuffer &buf) osg::notify(osg::WARN)<<"Detected potential memory leak in TXPParerse.cpp"<