David,
rather off-topic, but have you looked at using PDL (Perl Data language,
http://pdl.perl/org/) for your data manipulation?
Doug
On Friday 14 November 2003 13:08, David Christopher Asher wrote:
> I am looking for help deallocating memory I reserved in C subroutines in my
> Perl module. First a little background--I am generating images (plotting a
> boundary, interpolating a data field, running a smoothing algorithm, etc.).
> Sometimes, they are pretty large (several thousand pixels square), so I
> needed some sort of memory management to handle them, so I used Inline C.
>
> Say I have a subroutine in my library like this:
>
> sub make_boundary_map {
> my $image = create_image($MAX_SIZE);
> draw_polygon($image,$size_x,$size_y,@points);
> $image_file = open_file("image.tiff");
> write_image($image_file,$image,$size_x,$size_y);
> destroy_image($image);
> }
>
> and my Inline C section contains those functions.
>
> ////////////////////////////////////////////////////
>
> char * create_image(int size) {
> char * image = new char[size];
> memset(image,0xFF,size);
> return image;
> }
>
> void destroy_image(char * image) {
> delete [] image;
> }
>
> (assume there are draw_polygon(), open_file(), and write_image()
> subroutines as well, and they work fine)
>
> ////////////////////////////////////////////////////
>
> How can I rewrite these create/destroy functions such that Perl will
> actually reclaim the memory I free? I have tried using free(), SafeFree(),
> the Perl macro New() to create the image, and various other methods. If
> they are in the same subroutine, it works fine:
>
>
> void test_image(int size) {
> char * image;
> New(123,image,size,char);
> memset(image,CLEAR,size);
> Safefree( (void *) image);
> }
>
> I can run this repeatedly and it works fine
>
> foreach (1..100) {
> test_image_part(5000000);
> }
>
> HOWEVER, if I split it into two functions:
>
> char * test_image_part_1(int size) {
> char * image;
> New(123,image,size,char);
> memset(image,CLEAR,size);
> return image;
> }
>
> void test_image_part_2(char * image) {
> Safefree( (void *) image);
> }
>
> and call them one imediately after the other
>
> foreach (1..100) {
> $image = test_image_part_1(5000000);
> test_image_part_2($image);
> }
>
> it crashes, usually with a seg fault. There should really be no difference
> between the two, but apparently there is. Anyone out there use Inline to
> dynamically create memory space, use it for a while, then free it later
> with another function? An explanation would be good, but an example would
> be best. ^_^
>
> Thanks for any help anyone can provide.
>
> --
> Dave