[vtkusers] Error when deleting a vtkImageData object !

Michael Jackson mike.jackson at bluequartz.net
Fri Jan 1 10:15:22 EST 2010


   // Define vtk objects
   vtkBMPReader* m_ImageReader = vtkBMPReader::New();

// Below you are create a pointer to a newly created vtkImageData object
   vtkImageData* m_ImageData = vtkImageData::New();
// You should really have something like:
   vtkImageData* m_ImageData = NULL;

   vtkTexture* m_Texture = vtkTexture::New();

   // Read bmp file
   m_ImageReader->SetFileName("Image.bmp");
   // Get data from image file
//Now you are are assigning the vtkImageData Object from the BMPReader  
to your
// m_ImageData Pointer, which leaves the first pointer you created  
dangling
// which is a MEMORY LEAK.
   m_ImageData = m_ImageReader->GetOutput();
// If you really want to keep a reference to the output of the  
m_ImageReader around
// then you need to increase it's reference count by "Registering" it
   m_ImageData->Register(NULL);

   m_ImageData->Update();
   // Assign data to texture
   m_Texture->SetInput(m_ImageData);
   m_Texture->Update();
   // Other stuff
   // ...
   // ...
   // Now do some cleaning
// When you call "Delete" on the m_ImageReader, it will also "Delete"  
the
// m_ImageData because the reference count would drop to Zero. If you  
had actually
// "Registered" it (as above), then YOU need to also "UnRegister" it  
by calling
// Delete() on the m_ImageData object.
   m_ImageReader->Delete();
   m_ImageData->Delete(); //  Commenting this line  "solve" the error !
   m_Texture->Delete();

If you don't really need the m_ImageData object for anything else, you  
should be able to
directly hook up the vtkBMPReader to the vtkTexture and then just call  
"Update" on the vtkTexture object.

HTH
Mike Jackson


On Jan 1, 2010, at 9:03 AM, pof wrote:

> Hi vtk'ers
>
> I'm having a problem when I'm deleting a vtkImageData object.
> I obtain the following error message (located in  
> vtkImageAlgorithm::Execute()) :
> "Definition of Execute() method should be in subclass and you should  
> really use the ExecuteData(vtkInformation *request,...) signature  
> instead"
>
> Up to now, I've found no other workaround than NOT deleting the  
> object, which I'm obviously not really happy with.
>
> Herebelow is a small sample code that reproduces the problem (I'm  
> using vtk5.0.4 under MSVC++8).
>
> Any idea where my mistake comes from?
> JD.
>
>   // Define vtk objects
>   vtkBMPReader* m_ImageReader = vtkBMPReader::New();
>   vtkImageData* m_ImageData = vtkImageData::New();
>   vtkTexture* m_Texture = vtkTexture::New();
>
>   // Read bmp file
>   m_ImageReader->SetFileName("Image.bmp");
>   // Get data from image file
>   m_ImageData = m_ImageReader->GetOutput();
>   m_ImageData->Update();
>   // Assign data to texture
>   m_Texture->SetInput(m_ImageData);
>   m_Texture->Update();
>   // Other stuff
>   // ...
>   // ...
>   // Now do some cleaning
>   m_ImageReader->Delete();
>   m_ImageData->Delete(); //  Commenting this line  "solve" the error !
>   m_Texture->Delete();
>
> _______________________________________________




More information about the vtkusers mailing list