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