fixed memory leak in geos WKB/WKT calls

master
Oliver Tonnhofer 2013-05-15 13:49:41 +02:00
parent c907b6afd0
commit 0e70f383d9
2 changed files with 21 additions and 15 deletions

View File

@ -1,6 +1,7 @@
package geom
import (
"errors"
"goposm/element"
"goposm/geom/geos"
)
@ -37,10 +38,10 @@ func PointWKB(g *geos.GEOS, node element.Node) (*element.Geometry, error) {
if err != nil {
return nil, err
}
wkb, err := g.AsWKB(geom)
if err != nil {
wkb := g.AsWKB(geom)
if wkb == nil {
g.Destroy(geom)
return nil, err
return nil, errors.New("could not create wkb")
}
g.DestroyLater(geom)
return &element.Geometry{
@ -63,10 +64,10 @@ func LineStringWKB(g *geos.GEOS, nodes []element.Node) (*element.Geometry, error
coordSeq.SetXY(g, uint32(i), nd.Long, nd.Lat)
}
geom, err := coordSeq.AsLineString(g)
wkb, err := g.AsWKB(geom)
if err != nil {
wkb := g.AsWKB(geom)
if wkb == nil {
g.Destroy(geom)
return nil, err
return nil, errors.New("could not create wkb")
}
g.DestroyLater(geom)
return &element.Geometry{
@ -96,10 +97,10 @@ func PolygonWKB(g *geos.GEOS, nodes []element.Node) (*element.Geometry, error) {
if err != nil {
return nil, err
}
wkb, err := g.AsWKB(geom)
if err != nil {
wkb := g.AsWKB(geom)
if wkb == nil {
g.Destroy(geom)
return nil, err
return nil, errors.New("could not create wkb")
}
g.DestroyLater(geom)
return &element.Geometry{

View File

@ -135,15 +135,20 @@ func (this *GEOS) Buffer(geom *Geom, size float64) *Geom {
}
func (this *GEOS) AsWKT(geom *Geom) string {
return C.GoString(C.GEOSGeomToWKT_r(this.v, geom.v))
str := C.GEOSGeomToWKT_r(this.v, geom.v)
result := C.GoString(str)
C.free(unsafe.Pointer(str))
return result
}
func (this *GEOS) AsWKB(geom *Geom) ([]byte, error) {
func (this *GEOS) AsWKB(geom *Geom) []byte {
var size C.size_t
buf, err := C.GEOSGeomToWKB_buf_r(this.v, geom.v, &size)
if err != nil {
return nil, err
buf := C.GEOSGeomToWKB_buf_r(this.v, geom.v, &size)
if buf == nil {
return nil
}
return C.GoBytes(unsafe.Pointer(buf), C.int(size)), nil
result := C.GoBytes(unsafe.Pointer(buf), C.int(size))
C.free(unsafe.Pointer(buf))
return result
}
func (this *GEOS) IsValid(geom *Geom) bool {