Skip to content

Memory leak in ShapeKitGeometry.mm #7

@H95518

Description

@H95518

The code should be changed to like this:

-(id)initWithWKB:(const unsigned char *) wkb size:(size_t)wkb_size {
self = [self init];
if (self)
{
GEOSContextHandle_t handle = (GEOSContextHandle_t)self.handle;

    GEOSWKBReader *WKBReader = GEOSWKBReader_create_r(handle);
    _geosGeom = GEOSWKBReader_read_r(handle, WKBReader, wkb, wkb_size);
    GEOSWKBReader_destroy_r(handle, WKBReader);

    char *typeString = GEOSGeomType_r(handle, self.geosGeom);
    self.geomType = [NSString stringWithUTF8String: typeString];
    delete typeString;

    GEOSWKTWriter *WKTWriter = GEOSWKTWriter_create_r(handle);

    char *wktString = GEOSWKTWriter_write_r(handle, WKTWriter, self.geosGeom);
    self.wktGeom = [NSString stringWithUTF8String:wktString];
    delete wktString;

    GEOSWKTWriter_destroy_r(handle, WKTWriter);
}
return self;

}

-(id)initWithWKT:(NSString *) wkt {
self = [self init];
if (self)
{
GEOSContextHandle_t handle = (GEOSContextHandle_t)_handle;
GEOSGeometry *geosGeom = self.geosGeom;

    GEOSWKTReader *WKTReader = GEOSWKTReader_create_r(handle);
    _geosGeom = GEOSWKTReader_read_r(handle, WKTReader, [wkt UTF8String]);
    GEOSWKTReader_destroy_r(handle, WKTReader);

    char *typeString = GEOSGeomType_r(handle, geosGeom);
    self.geomType = [NSString stringWithUTF8String:typeString];
    delete typeString;

    GEOSWKTWriter *WKTWriter = GEOSWKTWriter_create_r(handle);
    char *wktString = GEOSWKTWriter_write_r(handle, WKTWriter, geosGeom);
    self.wktGeom = [NSString stringWithUTF8String:wktString];
    delete wktString;

    GEOSWKTWriter_destroy_r(handle, WKTWriter);
}

return self;

}

-(id)initWithGeosGeometry:(void *)geom {
self = [self init];
if (self)
{
GEOSContextHandle_t handle = (GEOSContextHandle_t)_handle;

    _geosGeom = (GEOSGeometry *)geom;

    char *typeString = GEOSGeomType_r(handle, _geosGeom);
    self.geomType = [NSString stringWithUTF8String:typeString];
    delete typeString;

    GEOSWKTWriter *WKTWriter = GEOSWKTWriter_create_r(handle);
    char *wktString = GEOSWKTWriter_write_r(handle, WKTWriter, _geosGeom);
    self.wktGeom = [NSString stringWithUTF8String:wktString];
    delete wktString;

    GEOSWKTWriter_destroy_r(handle, WKTWriter);
}
return self;    

}

-(id)initWithCoordinate:(CLLocationCoordinate2D)coordinate {
self = [self init];
if (self) {

    GEOSContextHandle_t handle = (GEOSContextHandle_t)_handle;

    GEOSCoordSequence *seq = GEOSCoordSeq_create_r(handle, 1,2);
    GEOSCoordSeq_setX_r(handle, seq, 0, coordinate.longitude);
    GEOSCoordSeq_setY_r(handle, seq, 0, coordinate.latitude);
    GEOSGeometry *newGeosGeom = GEOSGeom_createPoint_r(handle, seq);
    NSAssert (newGeosGeom != NULL, @"Error creating ShapeKitPoint");
    _geosGeom=newGeosGeom;

    // TODO: Move the destroy into the dealloc method
    // GEOSCoordSeq_destroy(seq);

    _coords = (CLLocationCoordinate2D *) malloc( sizeof(CLLocationCoordinate2D) );
    *_coords = coordinate;

    GEOSWKTWriter *WKTWriter = GEOSWKTWriter_create_r(handle);
    char *wktString = GEOSWKTWriter_write_r(handle, WKTWriter, newGeosGeom);
    self.wktGeom = [NSString stringWithUTF8String: wktString];
    delete wktString;
    GEOSWKTWriter_destroy_r(handle, WKTWriter);        

}    
return self;

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions