fixed memory leak in geos WKB/WKT calls
parent
c907b6afd0
commit
0e70f383d9
19
geom/geom.go
19
geom/geom.go
|
@ -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{
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue