[Insight-users] Malloc errors with repeated image IO??

Zachary Pincus zpincus at stanford.edu
Sun Mar 19 21:43:33 EST 2006


Hi folks,

In the process of reading in many (!) image files and storing the  
resulting images away (as Image::Pointer objects in some list or  
vector), I have run into some strange malloc errors.

Here are some test cases which seem to reproduce these errors. The  
code for the cases is at the end of this email; here follows  
descriptions of the tests and the malloc errors produced.

I'm using a CVS checkout of ITK from shortly after the 2.6 release,  
on OS X 10.4.5. Everything is compiled with GCC 4.0.1.

******
Case 0: [BASELINE] In a loop, create an ImageFileReader (and give it  
a valid file to read), and call Update(). The FileReader is destroyed  
and created anew each loop.

No errors are produced.


******
Case 1: In a loop, create an ImageFileReader, call Update(), and  
store the resulting image pointer in a std::vector. The FileReader is  
destroyed and created anew each loop.

The errors are a flood of identical lines (down to the object  
address), e.g.:
> itkTest(18420) malloc: *** error for object 0x7801600: incorrect  
> checksum for freed object - object was probably modified after  
> being freed, break at szone_error to debug
> itkTest(18420) malloc: *** set a breakpoint in szone_error to debug


******
Case 2: Create an ImageFileReader. In a loop, repeatedly call Update 
(), store the result away, and call DisconnectPipeline() so that the  
next loop through, a new image is created.

The error is a few lines similar to those in case 1, and then other  
errors, culminating in an exception:
> itkTest(24609) malloc: *** error for object 0x780ee00: incorrect  
> checksum for freed object - object was probably modified after  
> being freed, break at szone_error to debug
> itkTest(24609) malloc: *** set a breakpoint in szone_error to debug
> itkTest(24609) malloc: ***  Deallocation of a pointer not malloced:  
> 0x80008; This could be a double free(), or free() called with the  
> middle of an allocated block; Try setting environment variable  
> MallocHelp to see tools to help debug
> TIFFFillStrip: /Users/zpincus/Documents/Research/Theriot Lab/ 
> Experimental Data/Catherine Keratocytes/Images3/summed/ 
> 022505_antiV_1.tif: Data buffer too small to hold strip 0.
>
> itk::ExceptionObject (0x756ec30)
> Location: "void itk::TIFFImageIO::ReadGenericImage(void*, unsigned  
> int, unsigned int)"
> File: /Users/zpincus/Developer/ITK/Insight/Code/IO/itkTIFFImageIO.cxx
> Line: 536
> Description: itk::ERROR: TIFFImageIO(0x7573530): Problem reading  
> the row: 0

Does anyone have any thoughts as to what could be happening?

Zach Pincus



CODE FOR CASE 0:
----------------
#include "itkImage.h"
#include "itkImageFileReader.h"
#include <iostream>

typedef itk::Image<float, 2> FImage;
typedef itk::ImageFileReader<FImage> FReader;

int main(int argc, char* argv[] )
{
   if (argc < 2) return -1;

   for (int i = 0; i < 1000; i++)
     {
       try {
         FReader::Pointer fr = FReader::New();
         fr->SetFileName(argv[1]);
         fr->Update();
       } catch( itk::ExceptionObject & err ) {
         std::cout << err << std::endl;
         return -1;
       }
     }
   return 0;
}

CODE FOR CASE 1:
----------------
#include "itkImage.h"
#include "itkImageFileReader.h"
#include <iostream>
#include <vector>

typedef itk::Image<float, 2> FImage;
typedef itk::ImageFileReader<FImage> FReader;
typedef std::vector<FImage::Pointer> FIPVector;

int main(int argc, char* argv[] )
{
   if (argc < 2) return -1;

   FIPVector vec;
   for (int i = 0; i < 1000; i++)
     {
       try {
         FReader::Pointer fr = FReader::New();
         fr->SetFileName(argv[1]);
         fr->Update();
         vec.push_back(fr->GetOutput());
       } catch( itk::ExceptionObject & err ) {
         std::cout << err << std::endl;
         return -1;
       }
     }
   return 0;
}

CODE FOR CASE 2:
----------------
#include "itkImage.h"
#include "itkImageFileReader.h"
#include <iostream>
#include <vector>

typedef itk::Image<float, 2> FImage;
typedef itk::ImageFileReader<FImage> FReader;
typedef std::vector<FImage::Pointer> FIPVector;

int main(int argc, char* argv[] )
{
   if (argc < 2) return -1;

   FIPVector vec;
   FReader::Pointer fr = FReader::New();
   fr->SetFileName(argv[1]);
   for (int i = 0; i < 1000; i++)
     {
       try {
         fr->Update();
         vec.push_back(fr->GetOutput());
         fr->GetOutput()->DisconnectPipeline();
       } catch( itk::ExceptionObject & err ) {
         std::cout << err << std::endl;
         return -1;
       }
     }
   return 0;
}


More information about the Insight-users mailing list