|
From: <jw...@us...> - 2008-08-25 05:29:57
|
Revision: 18476
http://bzflag.svn.sourceforge.net/bzflag/?rev=18476&view=rev
Author: jwmelto
Date: 2008-08-25 05:30:07 +0000 (Mon, 25 Aug 2008)
Log Message:
-----------
Fix memory management (delete[] vs delete, unnecessary allocations).
Some whitespace (lots more is needed)
Modified Paths:
--------------
trunk/bzwgen/inc/Generator.h
trunk/bzwgen/inc/GridGenerator.h
trunk/bzwgen/inc/Logger.h
trunk/bzwgen/inc/MultiFace.h
trunk/bzwgen/src/BZWGenerator.cxx
trunk/bzwgen/src/BZWGeneratorPlugin.cxx
trunk/bzwgen/src/BuildZone.cxx
trunk/bzwgen/src/Mesh.cxx
trunk/bzwgen/src/MultiFace.cxx
trunk/bzwgen/src/Operation.cxx
trunk/bzwgen/src/bzwgen.cxx
Modified: trunk/bzwgen/inc/Generator.h
===================================================================
--- trunk/bzwgen/inc/Generator.h 2008-08-25 05:23:25 UTC (rev 18475)
+++ trunk/bzwgen/inc/Generator.h 2008-08-25 05:30:07 UTC (rev 18476)
@@ -112,8 +112,7 @@
* Destructor, frees the materials, the zones, but not the ruleset.
*/
virtual ~Generator( ) {
- for ( ZoneVectIter itr = zones.begin(); itr!= zones.end(); ++itr )
- delete ( *itr );
+ deletePointerVector( zones );
}
};
Modified: trunk/bzwgen/inc/GridGenerator.h
===================================================================
--- trunk/bzwgen/inc/GridGenerator.h 2008-08-25 05:23:25 UTC (rev 18475)
+++ trunk/bzwgen/inc/GridGenerator.h 2008-08-25 05:30:07 UTC (rev 18476)
@@ -53,7 +53,7 @@
* Destructor, frees the allocated map.
*/
virtual ~GridGenerator( ) {
- delete map;
+ delete[] map;
}
private:
/** Type of cell on the grid */
Modified: trunk/bzwgen/inc/Logger.h
===================================================================
--- trunk/bzwgen/inc/Logger.h 2008-08-25 05:23:25 UTC (rev 18475)
+++ trunk/bzwgen/inc/Logger.h 2008-08-25 05:30:07 UTC (rev 18476)
@@ -99,7 +99,7 @@
if (!fileStream) fileStream = new std::ofstream("log.txt");
}
~LoggerSingleton() {
- if (fileStream) delete fileStream;
+ delete fileStream;
}
private:
/**
Modified: trunk/bzwgen/inc/MultiFace.h
===================================================================
--- trunk/bzwgen/inc/MultiFace.h 2008-08-25 05:23:25 UTC (rev 18475)
+++ trunk/bzwgen/inc/MultiFace.h 2008-08-25 05:30:07 UTC (rev 18476)
@@ -19,6 +19,9 @@
#define __MULTIFACE_H__
#include "globals.h"
+
+#include <memory>
+
#include "Output.h"
#include "Face.h"
#include "Mesh.h"
@@ -34,7 +37,7 @@
/**
* Vector of component face pointers. Managed and deleted by the class.
*/
- FaceVector* comps;
+ std::auto_ptr<FaceVector> comps;
/**
* As MultiFace has many complex operations, it needs a pointer to the
* underlying mesh, to access vertex data.
@@ -45,10 +48,14 @@
* Standard constructor, takes the underlying mesh as an argument.
* Initializes the underlying component face vector.
*/
- MultiFace( Mesh* _mesh ) : Face( ), mesh( _mesh ) {
- comps = new FaceVector;
+ MultiFace( Mesh* _mesh ) : Face( ), comps(new FaceVector), mesh( _mesh )
+ {
}
/**
+ * Standard destructor, disposes of the component vector.
+ */
+ virtual ~MultiFace() { }
+ /**
* Detaches a face from the MultiFace. The id here is the internal index
* in the component vector. Returns a list of Mesh face ID's of the faces
* that are left after the detaching.
@@ -72,10 +79,6 @@
int componentCount() {
return comps->size();
}
- /**
- * Standard destructor, disposes of the component vector.
- */
- virtual ~MultiFace() { delete comps; }
private:
/**
* Updates the Z-coordinate of all stored faces. Called right before
Modified: trunk/bzwgen/src/BZWGenerator.cxx
===================================================================
--- trunk/bzwgen/src/BZWGenerator.cxx 2008-08-25 05:23:25 UTC (rev 18475)
+++ trunk/bzwgen/src/BZWGenerator.cxx 2008-08-25 05:30:07 UTC (rev 18476)
@@ -177,11 +177,11 @@
void BZWGenerator::generate( OutStream* outstream ) {
Logger.log( 1, "BZWGenerator : initializing... " );
- Generator* gen;
+ std::auto_ptr<Generator> gen;
if ( experimental )
- gen = new FaceGenerator( ruleset );
+ gen.reset(new FaceGenerator( ruleset ));
else
- gen = new GridGenerator( ruleset );
+ gen.reset(new GridGenerator( ruleset ));
Logger.log( 1, "BZWGenerator : parsing options... " );
gen->parseOptions( &cmd );
@@ -196,7 +196,6 @@
os.footer( );
Logger.log( 1, "BZWGenerator : generation done. ");
- delete gen;
}
// Local Variables: ***
Modified: trunk/bzwgen/src/BZWGeneratorPlugin.cxx
===================================================================
--- trunk/bzwgen/src/BZWGeneratorPlugin.cxx 2008-08-25 05:23:25 UTC (rev 18475)
+++ trunk/bzwgen/src/BZWGeneratorPlugin.cxx 2008-08-25 05:30:07 UTC (rev 18476)
@@ -18,7 +18,10 @@
void BZWGeneratorPlugin::process(bz_EventData *eventData) {
if (eventData->eventType == bz_eWorldFinalized) {
- delete cstr;
+ // This bothers me because this pointer has been given
+ // out. Potential pointer into freed memory...
+ delete[] cstr;
+ cstr = 0;
return;
}
@@ -35,14 +38,15 @@
return;
}
- OutStringStream* outstream = new OutStringStream(OutStringStream::out);
- generate(outstream);
+ OutStringStream outstream(OutStringStream::out);
+ generate(&outstream);
bz_GetWorldEventData_V1 *getWorldData = (bz_GetWorldEventData_V1 *) eventData;
// The following code is so ugly that I barely can look at it.
- cstr = new char [((OutStringStream*)(outstream))->str().size()+1];
- strcpy (cstr, ((OutStringStream*)(outstream))->str().c_str());
+ delete[] cstr;
+ cstr = new char [outstream.str().size()+1];
+ strcpy (cstr, outstream.str().c_str());
getWorldData->worldBlob = cstr;
getWorldData->generated = true;
worldGenerated = true;
Modified: trunk/bzwgen/src/BuildZone.cxx
===================================================================
--- trunk/bzwgen/src/BuildZone.cxx 2008-08-25 05:23:25 UTC (rev 18475)
+++ trunk/bzwgen/src/BuildZone.cxx 2008-08-25 05:30:07 UTC (rev 18476)
@@ -29,6 +29,7 @@
Logger.log( 4, "BuildZone : running ruleset 'start' rule..." );
String rulename = String("start");
+ // Possible memory leak here?
meshes = generator->getRuleSet()->run( mesh, baseFaceID, rulename );
Logger.log( 4, "BuildZone : complete" );
}
@@ -40,10 +41,7 @@
}
BuildZone::~BuildZone( ) {
- if ( meshes == NULL ) return;
- for ( MeshVectIter itr = meshes->begin(); itr!= meshes->end(); ++itr )
- delete (*itr);
- delete meshes;
+ deletePointerVector( meshes );
}
// Local Variables: ***
Modified: trunk/bzwgen/src/Mesh.cxx
===================================================================
--- trunk/bzwgen/src/Mesh.cxx 2008-08-25 05:23:25 UTC (rev 18475)
+++ trunk/bzwgen/src/Mesh.cxx 2008-08-25 05:30:07 UTC (rev 18476)
@@ -123,7 +123,7 @@
for ( int i = 0; i < size; i++ ) {
v[ f[faceID]->getVertex( i ) ] = nv[i];
}
- delete nv;
+ delete[] nv;
}
void Mesh::weldVertices( int a, int b ) {
@@ -277,7 +277,7 @@
}
Vertex stepA, stepB;
- DoubleVector* sdata = new DoubleVector(splitData->size());
+ DoubleVector sdata(splitData->size());
int splits = splitData->size()-1;
double length = horizontal ? faceH(fid) : faceV(fid);
@@ -285,14 +285,14 @@
double lsum = 0.0;
for (int i = 0; i < splits+1; i++) {
double value = splitData->at(i);
- (*sdata)[i] = value;
+ sdata[i] = value;
if (value >= 0.0) lsum += value; else relsum += -value;
}
if (relsum > 0) {
double relperunit = ( length-lsum ) / relsum;
for (int i = 0; i < splits+1; i++) {
- double value = sdata->at(i);
- if (value < 0.0) (*sdata)[i] = -value*relperunit;
+ double value = sdata.at(i);
+ if (value < 0.0) sdata[i] = -value*relperunit;
}
}
@@ -329,8 +329,8 @@
Vertex b = v[bs];
for (int i = 0; i < splits; i++) {
- a = a + stepA*sdata->at(i);
- b = b + stepB*sdata->at(i);
+ a = a + stepA*sdata.at(i);
+ b = b + stepB*sdata.at(i);
if (ssnap > EPSILON) {
Vertex A = a-v[as];
@@ -389,7 +389,6 @@
f[fid]->addVertex( idx3 );
}
- delete sdata;
return result;
}
@@ -497,8 +496,7 @@
Mesh::~Mesh() {
- for ( FaceVectIter itr = f.begin(); itr!= f.end(); ++itr )
- delete (*itr);
+ deletePointerVector( f );
}
Modified: trunk/bzwgen/src/MultiFace.cxx
===================================================================
--- trunk/bzwgen/src/MultiFace.cxx 2008-08-25 05:23:25 UTC (rev 18475)
+++ trunk/bzwgen/src/MultiFace.cxx 2008-08-25 05:30:07 UTC (rev 18476)
@@ -47,12 +47,12 @@
if (id >= int(comps->size())) return NULL;
updateFaces(mesh->getVertex(getVertex(0)).z);
- IntVector* result = new IntVector();
- IntVector* visited = new IntVector();
+ IntVector* result = new IntVector;
+ IntVector visited;
Face* f = comps->at(id);
- int index = pickRemovalIndex(comps->at(id),visited);
+ int index = pickRemovalIndex(comps->at(id),&visited);
while (index >= 0) {
printf("Element iteration...\n");
@@ -71,7 +71,7 @@
Face* oface = getOtherFaceWithVertex(f,vid);
oindex = (oface == NULL) ? -1 : oface->getVertexIndex(vid);
- visited->push_back(vid);
+ visited.push_back(vid);
nvtx.push_back(vid);
if (oindex < 0 ) {
@@ -102,11 +102,10 @@
nface->setMaterial( getMaterial() );
nface->setVertices( nvtx );
result->push_back(mesh->addFace(nface));
- index = pickRemovalIndex(comps->at(id),visited);
+ index = pickRemovalIndex(comps->at(id),&visited);
}
printf("Cleaning up\n");
- delete visited;
comps->erase(comps->begin() + id);
Modified: trunk/bzwgen/src/Operation.cxx
===================================================================
--- trunk/bzwgen/src/Operation.cxx 2008-08-25 05:23:25 UTC (rev 18475)
+++ trunk/bzwgen/src/Operation.cxx 2008-08-25 05:30:07 UTC (rev 18476)
@@ -47,16 +47,18 @@
}
OperationMultifaces::OperationMultifaces( RuleSet* _ruleset, Expression* _exp, StringVector* _facerules )
-: OperationSingle( _ruleset, _exp ), facerules( _facerules ), allsame( false ) {
+ : OperationSingle( _ruleset, _exp ), facerules( _facerules ), allsame( false )
+{
if ( facerules != NULL ) {
if ( facerules->size() == 0 ) {
delete facerules;
facerules = NULL;
- } else
+ } else {
if ( facerules->size() == 1 && facerules->at(0)[0] == '@' ) {
allsame = true;
facerules->at( 0 ).erase( 0, 1 );
}
+ }
}
}
@@ -66,10 +68,9 @@
return face;
}
flatten( mesh,face );
- IntVector* faces = ( (MultiFace*)mesh->getFace( face ) )->detachFace( math::roundToInt( value[0] ) );
- if ( faces != NULL ) {
- OperationMultifaces::runMesh( mesh, face, faces );
- delete faces;
+ std::auto_ptr<IntVector> faces(( (MultiFace*)mesh->getFace( face ) )->detachFace( math::roundToInt(value[0]) ));
+ if ( faces.get() != NULL ) {
+ OperationMultifaces::runMesh( mesh, face, faces.get() );
}
return face;
}
@@ -93,36 +94,36 @@
}
-int OperationExtrude::runMesh( Mesh* mesh, int face ) {
+int OperationExtrude::runMesh( Mesh* mesh, int face )
+{
if ( mesh == NULL ) return 0;
flatten( mesh, face );
if ( facerules != NULL ) {
- IntVector* faces = new IntVector;
- mesh->extrudeFace( face, value[0], mesh->getFace( face )->getMaterial(), faces );
- OperationMultifaces::runMesh( mesh, face, faces );
- delete faces;
+ IntVector faces;
+ mesh->extrudeFace( face, value[0], mesh->getFace( face )->getMaterial(), &faces );
+ OperationMultifaces::runMesh( mesh, face, &faces );
} else {
mesh->extrudeFace( face, value[0], mesh->getFace( face )->getMaterial() );
}
return face;
}
-int OperationExtrudeT::runMesh( Mesh* mesh, int face ) {
+int OperationExtrudeT::runMesh( Mesh* mesh, int face )
+{
if (mesh == NULL) return 0;
flatten( mesh, face );
- IntVector* faces = new IntVector;
- mesh->extrudeFace( face, value[0], mesh->getFace( face )->getMaterial(), faces );
+ IntVector faces;
+ mesh->extrudeFace( face, value[0], mesh->getFace( face )->getMaterial(), &faces );
double snap = ruleset->getAttr( "SNAP" );
double textile = ruleset->getAttr( "TEXTILE" );
- for ( size_t i = 0; i < faces->size(); i++ ) {
- mesh->textureFace( faces->at(i), snap, textile );
+ for ( size_t i = 0; i < faces.size(); i++ ) {
+ mesh->textureFace( faces.at(i), snap, textile );
}
if ( facerules != NULL ) {
- OperationMultifaces::runMesh( mesh, face, faces );
+ OperationMultifaces::runMesh( mesh, face, &faces );
}
- delete faces;
return face;
}
@@ -135,31 +136,28 @@
int OperationSplitFace::runMesh( Mesh* mesh,int face ) {
if ( mesh == NULL ) return 0;
- DoubleVector* dv = new DoubleVector( splits->size() );
+ DoubleVector dv( splits->size() );
for ( size_t i = 0; i < splits->size(); i++ )
- (*dv)[i] = splits->at(i)->calculate( mesh, face );
+ dv[i] = splits->at(i)->calculate( mesh, face );
- IntVector* faces;
- if (exp[0] != NULL)
- faces = mesh->splitFace( face, dv, horiz, exp[0]->calculate(mesh,face) );
- else
- faces = mesh->splitFace( face, dv, horiz );
+ double ssnap(0.0);
+ if (exp[0] != NULL) ssnap = exp[0]->calculate(mesh, face);
+ std::auto_ptr<IntVector> faces(mesh->splitFace( face, &dv, horiz, ssnap ));
+
if (facerules != NULL) {
- OperationMultifaces::runMesh( mesh, face, faces );
+ OperationMultifaces::runMesh( mesh, face, faces.get() );
}
- delete faces;
- delete dv;
return face;
}
-int OperationRepeat::runMesh( Mesh* mesh,int face ) {
+int OperationRepeat::runMesh( Mesh* mesh,int face )
+{
if (mesh == NULL) return 0;
flatten( mesh, face );
- IntVector* faces = mesh->repeatSubdivdeFace( face, value[0], horiz );
+ std::auto_ptr<IntVector> faces(mesh->repeatSubdivdeFace( face, value[0], horiz ));
if (facerules != NULL) {
- OperationMultifaces::runMesh( mesh, face, faces );
+ OperationMultifaces::runMesh( mesh, face, faces.get() );
}
- delete faces;
return face;
}
Modified: trunk/bzwgen/src/bzwgen.cxx
===================================================================
--- trunk/bzwgen/src/bzwgen.cxx 2008-08-25 05:23:25 UTC (rev 18475)
+++ trunk/bzwgen/src/bzwgen.cxx 2008-08-25 05:30:07 UTC (rev 18476)
@@ -57,9 +57,8 @@
int main (int argc, char* argv[]) {
if (BZWGen.parseCommandLine(argc,argv)) return 0;
if (BZWGen.setup()) return 1;
- OutFileStream* outstream = new OutFileStream(BZWGen.outname.c_str());
- BZWGen.generate(outstream);
- delete outstream;
+ OutFileStream outstream(BZWGen.outname.c_str());
+ BZWGen.generate(&outstream);
}
#endif
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|