# How to delete display node and allocated resources properly?

**URL:** https://discourse.slicer.org/t/how-to-delete-display-node-and-allocated-resources-properly/19979
**Category:** Development
**Created:** [October 3, 2021, 9:12pm UTC](https://discourse.slicer.org/t/how-to-delete-display-node-and-allocated-resources-properly/19979 "2021-10-03T21:12:45Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### Author: ![Mik](https://avatars.discourse-cdn.com/v4/letter/m/958977/32.png) [@Mik](https://discourse.slicer.org/u/Mik)
#### Post date: [October 3, 2021, 9:12pm UTC](https://discourse.slicer.org/t/how-to-delete-display-node-and-allocated-resources-properly/19979/1 "2021-10-03T21:12:45Z")

</div>

The process of adding support of multiple color bars via displayable manager [PR #5828](https://github.com/Slicer/Slicer/pull/5828).

The color bar display node is added to the scalar volume:

```auto
  // Create color bar and observe color bar by displayable node
  vtkMRMLColorBarDisplayNode* colorBarNode = vtkMRMLColorBarDisplayNode::SafeDownCast(mrmlScene->AddNewNodeByClass("vtkMRMLColorBarDisplayNode"));
  if (colorBarNode)
    {
    volumeNode->AddAndObserveDisplayNodeID(colorBarNode->GetID());
    return colorBarNode;
    }

```

The information about different display nodes is stored in display manager in the std::map (key - color bar display node ID, values - VTK widget, actor, and so on).

```auto
typedef std::tuple< vtkSmartPointer<vtkSlicerScalarBarActor>, \
                    vtkSmartPointer<vtkScalarBarWidget>, \
                    bool > ColorBarTuple;
  /// Map stores color bar display node ID, tuple
  std::map< std::string, ColorBarTuple > ColorBarTupleMap;

```

If i delete color bar display node i also want to delete VTK objects from the map object in the displayable manager.

```auto
      /// Delete color bar display node
      int n = d->colorLogic()->GetColorBarDisplayNodeNumberByNode( d->volumeNode, d->ColorBarNode);
      if (n != -1)
        {
        d->volumeNode->RemoveNthDisplayNodeID(n);
        this->mrmlScene()->RemoveNode(d->ColorBarNode);
        }

```

But when i try to delete data from map in display manager the application crashes

```auto
//---------------------------------------------------------------------------
void vtkMRMLColorBarDisplayableManager::OnMRMLSceneNodeRemoved(vtkMRMLNode* node)
{
  this->Superclass::OnMRMLSceneNodeRemoved(node);

  if (!node || !this->GetMRMLScene())
    {
    vtkErrorMacro("OnMRMLSceneNodeRemoved: Invalid MRML scene or input node");
    return;
    }

  if (node->IsA("vtkMRMLColorBarDisplayNode"))
    {
    vtkUnObserveMRMLNodeMacro(node);

    vtkMRMLColorBarDisplayNode* dispNode = vtkMRMLColorBarDisplayNode::SafeDownCast(node);
 
    auto it = this->Internal->ColorBarTupleMap.find(node->GetID());
    if (it != this->Internal->ColorBarTupleMap.end())
      {
      /// Delete VTK objects

      this->Internal->ColorBarTupleMap.erase(it); /// Crash of the 3D Slicer
      }
    }
}

```

Could i delete nodes in a display manager, and what is the proper way to do that? For example in “Volume Rendering” module the display nodes are stored and deleted in a logic and not in display manager.
