[vtkusers] Internal data source memory leak
Utkarsh Ayachit
utkarsh.ayachit at kitware.com
Thu Dec 15 08:16:59 EST 2016
Kit,
vtkAlgorithm already supports API such as SetInputDataObject(...).
Isn't that sufficient in your case?
Utkarsh
On Thu, Dec 8, 2016 at 9:50 AM, Kit Chambers <kit.chambers.kc at gmail.com> wrote:
> 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
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
>
> Search the list archives at: http://markmail.org/search/?q=vtkusers
>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/vtkusers
More information about the vtkusers
mailing list