View Issue Details Jump to Notes ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0015427VTK(No Category)public2015-04-17 02:462016-08-12 09:55
ReporterArnaud Gelas 
Assigned ToKitware Robot 
PrioritynormalSeverityminorReproducibilityhave not tried
StatusclosedResolutionmoved 
PlatformOSOS Version
Product Version6.0.0 
Target VersionFixed in Version 
Summary0015427: VTK 6.2.0 Bug in vtkVRMLImporter, example crashes if there are more than one instance of vtkVRMLImporter
DescriptionHi all,

We have slightly modified the following wiki example:

    http://www.itk.org/Wiki/VTK/Examples/Cxx/IO/VRML [^]


As follows:

    
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkVRMLImporter.h>
#include <vtkDataSet.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
 
int main ( int argc, char *argv[])
{
  if(argc != 2)
    {
    std::cout << "Required arguments: Filename" << std::endl;
    return EXIT_FAILURE;
    }
 
  std::string filename = argv[1];
  std::cout << "Reading " << filename << std::endl;
 
  vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
  vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->AddRenderer(renderer);
 
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor->SetRenderWindow(renderWindow);
 
  // VRML Import
  vtkSmartPointer<vtkVRMLImporter> importer = vtkSmartPointer<vtkVRMLImporter>::New();
  importer->SetFileName ( filename.c_str() );
  importer->SetRenderWindow(renderWindow);
  importer->Update();
 
  renderWindow->Render();
  renderWindowInteractor->Start();

  vtkSmartPointer<vtkRenderer> renderer2 = vtkSmartPointer<vtkRenderer>::New();
  vtkSmartPointer<vtkRenderWindow> renderWindow2 = vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow2->AddRenderer(renderer2);
 
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor2 = vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor2->SetRenderWindow(renderWindow2);
 
  // VRML Import
  vtkSmartPointer<vtkVRMLImporter> importer2 = vtkSmartPointer<vtkVRMLImporter>::New();
  importer2->SetFileName ( filename.c_str() );
  importer2->SetRenderWindow(renderWindow2);
  importer2->Update();
 
  renderWindow2->Render();
  renderWindowInteractor2->Start();


 
  return EXIT_SUCCESS;
}



As you can see the modification is quite simple, we have just created 2 instances of every objects…

This naive example crashes when exiting (trying to delete the second importer, i.e. importer2).

Arnaud
TagsNo tags attached.
ProjectTBD
Typecrash
Attached Files

 Relationships

  Notes
(0036310)
Betsy McPhail (developer)
2016-07-06 16:57

This can be reproduced with a very simple example:

int main(int argc, char *argv[])
{
  std::string filename = "bridge.wrl";

  vtkSmartPointer<vtkVRMLImporter> importer = vtkSmartPointer<vtkVRMLImporter>::New();
  importer->SetFileName(filename.c_str());
  importer->Read();

  vtkSmartPointer<vtkVRMLImporter> importer2 = vtkSmartPointer<vtkVRMLImporter>::New();
  importer2->SetFileName(filename.c_str());
  importer2->Read();

  importer->Delete();
  importer2->Delete();

  return EXIT_SUCCESS;
}
(0036311)
Betsy McPhail (developer)
2016-07-06 16:58

The 'TestVRMLImporter' test passes because the first importer is deleted before the second is created.
(0036312)
Betsy McPhail (developer)
2016-07-06 17:06

The problematic code is here:

vtkVRMLImporter::~vtkVRMLImporter()
{
  ...

  // According to Tom Citriniti the useList must not be deleted until the
  // instance is destroyed. The importer was crashing when users asked for a
  // DEF node from within the VRML file. This DEF mechanism allows you to
  // name a node inside the VRML file and refer to it from other nodes or
  // from scripts that can be associated with the VRML file. A vector of
  // these is created in the importer and has to live until the class is
  // deleted.
  delete this->Parser->useList; <--- This fails when the second importer is deleted
  this->Parser->useList = NULL;
  vtkVRMLAllocator::CleanUp(); <--- This removes the second importer's 'useList'...

  ...
}

Note: The other vtkVRMLVectorType objects (typeList and currentField) are deleted in ImportEnd().
(0037383)
Kitware Robot (administrator)
2016-08-12 09:55

Resolving issue as `moved`.

This issue tracker is no longer used. Further discussion of this issue may take place in the current VTK Issues page linked in the banner at the top of this page.

 Issue History
Date Modified Username Field Change
2015-04-17 02:46 Arnaud Gelas New Issue
2016-07-06 14:19 Betsy McPhail Assigned To => Betsy McPhail
2016-07-06 16:57 Betsy McPhail Note Added: 0036310
2016-07-06 16:58 Betsy McPhail Note Added: 0036311
2016-07-06 17:06 Betsy McPhail Note Added: 0036312
2016-07-07 09:33 Betsy McPhail Assigned To Betsy McPhail =>
2016-08-12 09:55 Kitware Robot Note Added: 0037383
2016-08-12 09:55 Kitware Robot Status backlog => closed
2016-08-12 09:55 Kitware Robot Resolution open => moved
2016-08-12 09:55 Kitware Robot Assigned To => Kitware Robot


Copyright © 2000 - 2018 MantisBT Team