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