[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