[vtkusers] Internal data source memory leak

Kit Chambers kit.chambers.kc at gmail.com
Thu Dec 8 09:50:28 EST 2016


Hi,

For a variety of reasons I want to write a VTK filter which can take it input from a connection or an internal data source. I have come up with a method that works, but it is showing up a memory leak when i run with VTK_DEBUG_LEAKS=ON.


Essentially I have a data source which looks something like this:

	class vtkDataSource : public vtkImageAlgorithm
	{
	public:
		…. blah blah … 

  		//! Set the internal data source
  		virtual int SetInputData(vtkImageData* data)
  		{
			this->InternalData=data;
			this->Modified();
			return 1;
  		}
	protected:
  		vtkDataSource(){
  			this->SetNumberOfInputPorts(0);
  			this->SetNumberOfOutputPorts(1);
  			this->InternalData=nullptr;
		}

 	 	~vtkDataSource(){}

 		int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *){
	
			if(this->InternalData==nullptr){
	  	  		vtkErrorMacro("no input data");
	  	  		return 0;
			}
			vtkSmartPointer<vtkImageData> outData = vtkImageData::GetData(outputVector);
			outData->ShallowCopy(this->InternalData);
			return 1;
		}
	private:
  		vtkSmartPointer<vtkImageData> InternalData;
	};

And then I have a filter which looks like this: 

	class vtkInternalDataSourceFilter : public vtkImageAlgorithm
	{
	public:
		… blah blah ...

  		//! Set the internal data source
  		virtual int SetInputData(vtkImageData* data)
		{
			this->InternalData = vtkSmartPointer<vtkDataSource>::New();
			this->InternalData->SetInputData(data);

			// This line triggers the memory leak
			this->SetInputConnection(0,this->InternalData->GetOutputPort(0));
			this->Modified();
			return 1;
		}
	protected:
  		vtkInternalDataSourceFilter(){
  			this->SetNumberOfInputPorts(1);
  			this->SetNumberOfOutputPorts(1);
		}
  		~vtkInternalDataSourceFilter(){}

  		int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *){
  			vtkSmartPointer<vtkImageData> input = vtkImageData::GetData(inputVector[0],0);
			… do something …
			return 1;
		}
	private:
  		vtkSmartPointer<vtkDataSource> InternalData;
	};


You then run the filter using 

	vtkSmartPointer<vtkInternalDataSourceFilter> flt = vtkSmartPointer<vtkInternalDataSourceFilter>::New();
	flt->SetInputData(Img);
	flt->Update();

Specifically I get 

	vtkDebugLeaks has detected LEAKS!
	Class "vtkDataSource" has 1 instance still around.
	Class "vtkCellData" has 2 instances still around.
	Class "vtkInformationIntegerVectorValue" has 3 instances still around.
	Class "vtkInformationVector" has 4 instances still around.
	Class "vtkPointData" has 2 instances still around.
	Class "vtkCompositeDataPipeline" has 1 instance still around.
	Class "vtkPoints" has 2 instances still around.
	Class "vtkInformation" has 16 instances still around.
	Class "vtkInformationIntegerPointerValue" has 2 instances still around.
	Class "vtkIdList" has 2 instances still around.
	Class "vtkDoubleArray" has 2 instances still around.
	Class "vtkAlgorithmOutput" has 1 instance still around.
	Class "vtkInformationIntegerValue" has 32 instances still around.
	Class "vtkImageData" has 2 instances still around.
	Class "vtkFloatArray" has 1 instance still around.
	Class "vtkInformationStringValue" has 1 instance still around.
	Class "vtkInformationExecutivePortVectorValue" has 1 instance still around.
	Class "vtkVoxel" has 2 instances still around.
	Class "vtkFieldData" has 2 instances still around.
	Class "vtkCommand or subclass" has 2 instances still around.
	Class "vtkInformationExecutivePortValue" has 1 instance still around.

however if I run everything normally it works fine.

	// Create a data source
	vtkSmartPointer<vtkDataSource> src = vtkSmartPointer<vtkDataSource>::New();
	src->SetInputData(Img);
	src->Update();

	vtkSmartPointer<vtkInternalDataSourceFilter> flt = vtkSmartPointer<vtkInternalDataSourceFilter>::New();
	lt->SetInputConnection(0,src->GetOutputPort(0));
	flt->Update();


Any help would be appreciated and apologies for the large amount of code in this message. 


Kit



More information about the vtkusers mailing list