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

Reply via email to