[GRASS-dev] sqlite driver: G_free() missing?
Brad Douglas
rez at touchofmadness.com
Fri Jul 7 05:33:11 EDT 2006
Markus,
Comments below per usual.
On Thu, 2006-07-06 at 10:12 +0200, Markus Neteler wrote:
> Hi,
>
> while testing:
>
> v.random random n=1000000
> v.out.ascii random > random.csv
> v.in.ascii random.csv out=random2
>
> with the sqlite driver, I observed that it eats a lot
> of memory. Since v.in.ascii works ok with the dbf driver, the
> problem must be in the sqlite driver. Therein I found some memory
> allocations but no G_free():
>
> cd db/drivers/sqlite/
> grep malloc *
> cursor.c: c = (cursor *) db_malloc(sizeof(cursor));
> describe.c: c->kcols = (int *) G_malloc ( nkcols * sizeof(int) );
> error.c: errMsg = (dbString *) G_malloc(sizeof(dbString));
>
> My malloc knowledge is limited, do we need to add some
> G_free() statements there?
There is nothing inherently wrong with cursor.c and describe.c.
In cursor.c a 'cursor' struct is initially allocated in function
alloc_cursor(). In describe.c, an element of the 'cursor' structure is
allocated. There is also a related function, free_cursor() that free()s
the memory. There is only a memory leak if alloc_cursor() is called
without a corresponding free_cursor(), but the memory is free()d
regardless at executable termination.
I don't see any reason why the memory allocation in describe.c shouldn't
be moved to alloc_cursor() in cursor.c. It may be more readable that
way.
In, error.c a function init_error() allocates enough memory to hold
strings. It appears that the code 'if (!errMsg) {...' functions as a
poor "this only happens once" block. There should probably be a
corresponding free_error() function, but it isn't really necessary since
most people would most likely call it close to program termination.
Sorry for the length, but in short, there's really nothing wrong. :-)
--
Brad Douglas <rez touchofmadness com> KB8UYR
Address: 37.493,-121.924 / WGS84 National Map Corps #TNMC-3785
More information about the grass-dev
mailing list