Changeset 8289

Show
Ignore:
Timestamp:
05/08/08 17:17:53
Author:
robert
Message:

From Sebastien Messerschmidt, "attached you'll find a patch for the shp-plugin.
I've spotted huge memory leaks int ShapeParser? and fixed them.
Also, there was a missing destructor (PolygonM) and a missing member initialization (PolygonZ)
Would be nice if someone could test the changes.

To release the memory just if no reading error happened (and therefore the arrays would be valid) I've added an macro to release and reset the pointers at once. I'm not using macros myself very often as I don't like them, but I think it doesn't hurt in this code.

"

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • OpenSceneGraph/trunk/src/osgPlugins/shp/ESRIShape.cpp

    r7639 r8289  
    1010 
    1111using namespace ESRIShape ; 
     12 
     13#define SAFE_DELETE_ARRAY( ptr ) delete[] ptr; ptr = 0L; 
    1214 
    1315template <class T> 
     
    244246MultiPoint::~MultiPoint() 
    245247{ 
    246     delete [] points; 
     248    delete[] points; 
    247249} 
    248250 
     
    252254    if( rh.read(fd) == false ) 
    253255        return false; 
     256     
     257    SAFE_DELETE_ARRAY( points ); 
    254258 
    255259    Integer shapeType; 
     
    318322        return false; 
    319323 
     324    SAFE_DELETE_ARRAY( parts ); 
     325    SAFE_DELETE_ARRAY( points ); 
     326 
    320327    Integer shapeType; 
    321328    if( readVal<Integer>(fd, shapeType, LittleEndian ) == false ) 
     
    387394        return false; 
    388395 
     396    SAFE_DELETE_ARRAY( parts ); 
     397    SAFE_DELETE_ARRAY( points ); 
     398 
    389399    Integer shapeType; 
    390400    if( readVal<Integer>(fd, shapeType, LittleEndian ) == false ) 
     
    501511    if( rh.read(fd) == false ) 
    502512        return false; 
     513 
     514    SAFE_DELETE_ARRAY( points ); 
     515    SAFE_DELETE_ARRAY( mArray ); 
    503516 
    504517    Integer shapeType; 
     
    591604        return false; 
    592605 
     606    SAFE_DELETE_ARRAY( parts ); 
     607    SAFE_DELETE_ARRAY( points ); 
     608    SAFE_DELETE_ARRAY( mArray ); 
     609 
    593610    Integer shapeType; 
    594611    if( readVal<Integer>(fd, shapeType, LittleEndian ) == false ) 
     
    671688} 
    672689 
     690PolygonM::~PolygonM() 
     691{ 
     692    delete[] parts; 
     693    delete[] points; 
     694    delete[] mArray; 
     695}; 
     696 
     697 
    673698bool PolygonM::read( int fd ) 
    674699{ 
     
    676701    if( rh.read(fd) == false ) 
    677702        return false; 
     703 
     704    SAFE_DELETE_ARRAY( parts ); 
     705    SAFE_DELETE_ARRAY( points ); 
     706    SAFE_DELETE_ARRAY( mArray ); 
    678707 
    679708    Integer shapeType; 
     
    820849    if( rh.read(fd) == false ) 
    821850        return false; 
     851 
     852    SAFE_DELETE_ARRAY( points ); 
     853    SAFE_DELETE_ARRAY( zArray ); 
     854    SAFE_DELETE_ARRAY( mArray ); 
    822855 
    823856    Integer shapeType; 
     
    924957    delete [] points; 
    925958    delete [] zArray; 
    926     if( mArray != 0L ) 
    927         delete [] mArray; 
     959    delete [] mArray; 
    928960} 
    929961 
     
    933965    if( rh.read(fd) == false ) 
    934966        return false; 
     967 
     968    SAFE_DELETE_ARRAY( parts ); 
     969    SAFE_DELETE_ARRAY( points ); 
     970    SAFE_DELETE_ARRAY( zArray ); 
     971    SAFE_DELETE_ARRAY( mArray ); 
    935972 
    936973    Integer shapeType; 
     
    9771014    int Z = Y + 16 + (8 * numPoints); 
    9781015 
    979     if( rh.contentLength > Z ) 
     1016    if( rh.contentLength != Z ) 
    9801017    {  
    9811018        mRange.read(fd); 
     
    9971034    numPoints(0),  
    9981035    parts(0L),  
    999     points(0L) , 
     1036    points(0L), 
     1037    zArray(0L), 
    10001038    mArray(0L) 
    10011039{} 
     
    10211059        points[i] = p.points[i]; 
    10221060        zArray[i] = p.zArray[i]; // jcm  
     1061    // M-Array seems to be missing sometimes 
     1062    if(p.mArray)      
    10231063        mArray[i] = p.mArray[i]; 
    10241064    } 
     
    10301070    delete [] points; 
    10311071    delete [] zArray; 
    1032     if( mArray != 0L ) 
    1033         delete [] mArray; 
     1072    delete [] mArray; 
    10341073} 
    10351074 
     
    10391078    if( rh.read(fd) == false ) 
    10401079        return false; 
     1080     
     1081    SAFE_DELETE_ARRAY( parts ); 
     1082    SAFE_DELETE_ARRAY( points ); 
     1083    SAFE_DELETE_ARRAY( zArray ); 
     1084    SAFE_DELETE_ARRAY( mArray ); 
    10411085 
    10421086    Integer shapeType; 
     
    10831127    int  Y = X + (16*numPoints); 
    10841128    int  Z = Y + 16 + (8*numPoints); 
    1085     if( rh.contentLength > Z ) 
     1129    if( rh.contentLength != Z ) 
    10861130    { 
    10871131        if( mRange.read(fd) == false ) 
     
    11661210    delete [] points; 
    11671211    delete [] zArray; 
    1168     if( mArray != 0L ) 
    1169         delete [] mArray; 
     1212    delete [] mArray; 
    11701213} 
    11711214 
     
    11751218    if( rh.read(fd) == false ) 
    11761219        return false; 
     1220 
     1221    SAFE_DELETE_ARRAY( parts ); 
     1222    SAFE_DELETE_ARRAY( partTypes ); 
     1223    SAFE_DELETE_ARRAY( points ); 
     1224    SAFE_DELETE_ARRAY( zArray ); 
     1225    SAFE_DELETE_ARRAY( mArray ); 
    11771226 
    11781227    Integer shapeType; 
  • OpenSceneGraph/trunk/src/osgPlugins/shp/ESRIShape.h

    r7639 r8289  
    275275    PolygonM(const PolygonM &p); 
    276276 
     277    virtual ~PolygonM(); 
     278 
    277279    bool read( int fd ); 
    278280};