vtkRenderWindow memory leak

Hi VTK Team

I encounter a memory leak when use the code below, RAM utilization is going up.

It seems that vtkRenderWindow is not freed correctly. If I put out of the loop vtkRenderwindow, everything is ok.

Also, It seems to be an old problem as you can see here (RAM blow out when looping vtkRenderWindow render). This problem is still present on the last release.

def test_memory_leak():
    colors = vtkNamedColors()

    # create source
    source = vtkSphereSource()
    source.SetCenter(0, 0, 0)
    source.SetRadius(5.0)
    source.SetPhiResolution(30)
    source.SetThetaResolution(30)

    # mapper
    mapper = vtkPolyDataMapper()
    mapper.SetInputConnection(source.GetOutputPort())

    # actor
    actor = vtkActor()
    actor.GetProperty().SetColor(colors.GetColor3d('IndianRed'))
    actor.GetProperty().SetSpecular(0.6)
    actor.GetProperty().SetSpecularPower(30)
    actor.SetMapper(mapper)

    for time in range(200):
        # create a rendering window and renderer
        ren = vtkRenderer()
        renWin = vtkRenderWindow()
        renWin.AddRenderer(ren)
        renWin.SetWindowName('Screenshot')

        # create a renderwindowinteractor
        iren = vtkRenderWindowInteractor()
        iren.SetRenderWindow(renWin)

        #renwin offscreen
        renWin.SetOffScreenRendering(1)

        # assign actor to the renderer
        ren.AddActor(actor)
        ren.SetBackground(colors.GetColor3d('MistyRose'))

        renWin.Render()

        # screenshot code:
        w2if = vtkWindowToImageFilter()
        w2if.SetInput(renWin)
        w2if.SetInputBufferTypeToRGB()
        w2if.ReadFrontBufferOff()
        w2if.Update()

        writer = vtkPNGWriter()
        writer.SetFileName('file%02d.png' % time)
        writer.SetInputConnection(w2if.GetOutputPort())
        writer.Write()

test_memory_leak()

I am on macOsX M1, using rosetta system (x86_64), python 3.9.13, vtk 9.2.5

Not sure, but it seems related and they are working on it : https://gitlab.kitware.com/vtk/vtk/-/issues/18573

Hello,

I’m not sure whether that such test can realiably diagnose a leak. I see a loop that creates 400 objects and Python’s garbage colletion and memory management are a black box. I believe you can try forcing a GC after running the loop and then measure memory consumption.

best,

Paulo

Thank you for your feedback @Paulo_Carvalho

I followed your advice, and simplify the loop. I still observe a leak. The RAM is slowly increasing. See below the code:

def test_memory_leak():
      for time in range(200):
              gc.collect()
              ren = vtkRenderer()
              renWin = vtkRenderWindow()
              renWin.AddRenderer(ren)
              renWin.SetWindowName('Screenshot')
              gc.collect() 


test_memory_leak()

It’s been a very long time, I did not need to touch C++. I will try to find the time to reproduce this example and see if I observe this leak in C++ also.

This user is also testing memory leaks, in C++ code: Memory leak occurs if I use vtkSmartPointer in sub-thread. - #2 by sohnishi
You could take inspiration from his code + VTK examples + VTK_DEBUG_LEAKS