[vtkusers] bug with multiple render windows?
N Smethurst
nick.smethurst at free.fr
Wed Feb 19 11:19:13 EST 2003
Hi
I'm sorry to repost this but it seems my original post didn't
have the MIME information decoded and thus it was difficult
to read. The original message (which I pray displays correctly
now) is as follows:
I am working on an application that uses multiple render windows
and have noticed that memory is leaked on each render window
destruction. VTK's leak detection reports nothing and manual
examination of object reference counts confirms that my code seems
to be functioning correctly. I have tried nightly builds from
17/01/03 (using cmake 1.4) and 09/02/03 (using cmake 1.6) on
mandrake linux 9.0.
I am sorry if this email is rather long but I feel that I should
be specific and detailed. Here is a piece of code to illustrate
this behaviour. The code doesn't do anything apart from creating
render windows and deleting them after rendering once, pausing
between actions so I can record memory usage:
///////////////////start code///////////////////
#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <stdio.h>
int main()
{
vtkConeSource *cone = vtkConeSource::New();
vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
mapper->SetInput(cone->GetOutput());
vtkActor *actor = vtkActor::New();
actor->SetMapper(mapper);
// create first window
vtkRenderer *ren1 = vtkRenderer::New();
ren1->AddActor(actor);
vtkRenderWindow *renWin1 = vtkRenderWindow::New();
renWin1->AddRenderer(ren1);
renWin1->Render();
// correct reference counts
cone->Delete();
mapper->Delete();
actor->Delete();
ren1->Delete();
cout << "Created objects and first renderer & renWin.\n";
// pause to check memory usage
char temp;
cin >> temp;
// create second window
vtkRenderer *ren2 = vtkRenderer::New();
ren2->AddActor(actor);
vtkRenderWindow *renWin2 = vtkRenderWindow::New();
renWin2->AddRenderer(ren2);
ren2->Delete();
renWin2->Render();
cout << "Created second renderer and renWindow.\n";
cin >> temp;
// create third window
vtkRenderer *ren3 = vtkRenderer::New();
ren3->AddActor(actor);
vtkRenderWindow *renWin3 = vtkRenderWindow::New();
renWin3->AddRenderer(ren3);
ren3->Delete();
renWin3->Render();
cout << "Created third renderer and renWindow.\n";
cin >> temp;
// create fourth window
vtkRenderer *ren4 = vtkRenderer::New();
ren4->AddActor(actor);
vtkRenderWindow *renWin4 = vtkRenderWindow::New();
renWin4->AddRenderer(ren4);
ren4->Delete();
renWin4->Render();
cout << "Created fourth renderer and renWindow.\n";
cin >> temp;
// delete one by one in order to record memory usage
renWin4->Delete();
cout << "Deleted fourth ren window.\n";
cin >> temp;
renWin3->Delete();
cout << "Deleted third ren window.\n";
cin >> temp;
renWin2->Delete();
cout << "Deleted second ren window.\n";
cin >> temp;
renWin1->Delete();
return 0;
}
///////////////////end code///////////////////
I get the following memory usage with the 17/01/03 nightly build:
total difference leak size
VmSize VmRss VmSize VmRss VmSize VmRss
one window created 165016 14268
two windows created 166556 14828 1540 560
three windows created 168084 15364 1528 536
four windows created 169612 15904 1528 540
fourth window deleted 167996 15356 -1616 -548 -88 -8
third window deleted 166776 15032 -1220 -324 308 212
second window deleted 165552 14704 -1224 -328 316 232
total leak: 536 436
With the 09/02/03 nightly build, I get the following:
total difference leak size
VmSize VmRss VmSize VmRss VmSize VmRss
one window created 29528 11244
two windows created 32892 12392 3364 1148
three windows created 36256 13524 3364 1132
four windows created 39624 14652 3368 1128
fourth window deleted 38924 14412 -700 -240 2668 888
third window deleted application crashes with error:
XIO: fatal IO error 9 (Bad file descriptor) on X server ":0.0"
after 362 requests (361 known processed) with 0 events remaining.
(However, this crash does not happen in my application!)
Running a piece of non-vtk code with
int* a=new int[50000];
and
delete []a;
commands in place of the vtk creation/deletion results in the
following:
total difference leak size
VmSize VmRss VmSize VmRss VmSize VmRss
ready to create.. 29044 12896
one created 29240 13100 196 204
two created 29436 13296 196 196
three created 29632 13492 196 196
fourth created 29828 13688 196 196
fourth deleted 29632 13492 -196 -196 0 0
third deleted 29436 13296 -196 -196 0 0
second deleted 29240 13100 -196 -196 0 0
first deleted 29044 12904 -196 -196 0 8
total leak: 0 8
hence the memory management of the kernel seems to be working
correctly.
In my actual application, if render windows are repeatidly created
and distroyed, the memory usage climbs and climbs and is not
released until the whole application is closed.
I have noticed that I get the following warning messages when
running my application and closing a window. I'm not sure if they
are relevant. They do not appear when running the code given here:
Generic Warning:
In /home/nic/comp/VTK/VTK/Common/vtkDebugLeaks.cxx, line 280
Deleting unknown object: vtkXOpenGLRenderWindow
Generic Warning:
In /home/nic/comp/VTK/VTK/Common/vtkDebugLeaks.cxx, line 280
Deleting unknown object: vtkRenderWindowInteractor
Kind regards
Nick
More information about the vtkusers
mailing list