[vtkusers] QVTKWidget2 memory leak?

Jonathan Morra jonmorra at gmail.com
Tue Feb 28 20:47:22 EST 2012


Fair enough, however that is ancillary to my problem.

On Tue, Feb 28, 2012 at 3:14 PM, Alex Malyushytskyy <alexmalvtk at gmail.com>wrote:

> The line below will crush the program. cause :widget will be deleted
> twice, one time by parent ,
> one time when going out of scope.
>
> MyQVTKWidget2 widget(imageViewer);
>
>
> You should never do such thing with Qt widget( and any QObject derived
> classes
> Use new operator to instantiate children.
>
> Alex
>
>
>
> On Fri, Feb 24, 2012 at 2:25 PM, Jonathan Morra <jonmorra at gmail.com>
> wrote:
> > OK, here is a small example that shows the problem.  I'm monitoring the
> > memory using task manager.  When the render line is commented out the
> memory
> > stays constant as you mouse over the image.  However, if that line is
> > uncommented then then memory climbs rapidly.  The program crashes when
> you
> > exit, but that doesn't concern me right now, I'm focused on the memory
> leak.
> >
> > Thanks
> >
> > #include <QtGui/QApplication>
> >
> > #include <QMainWindow>
> >
> > #include <QVTKWidget2.h>
> >
> > #include <vtkImageViewer2.h>
> >
> > #include <vtkImageData.h>
> >
> > #include <vtkPointData.h>
> >
> > #include <vtkGenericOpenGLRenderWindow.h>
> >
> > class MyQVTKWidget2 : public QVTKWidget2 {
> >
> > public:
> >
> >     MyQVTKWidget2 (vtkImageViewer2 *imageViewer, QWidget *parent = 0) :
> > QVTKWidget2(parent) {
> >
> >         this->imageViewer = imageViewer;
> >
> >     }
> >
> >     virtual ~MyQVTKWidget2() {
> >
> >         imageViewer->Delete();
> >
> >     }
> >
> >     void mouseMoveEvent(QMouseEvent *) {
> >
> >         // Comment out this line to see the memory stay constant
> >
> >         imageViewer->Render();
> >
> >     }
> >
> > private:
> >
> >     vtkImageViewer2 *imageViewer;
> >
> > };
> >
> > int main(int argc, char *argv[]) {
> >
> >     QApplication a(argc, argv);
> >
> >     vtkImageData *imageData = vtkImageData::New();
> >
> >     imageData->SetExtent(0, 100, 0, 100, 0, 100);
> >
> >     imageData->SetOrigin(0, 0, 0);
> >
> >     imageData->SetSpacing(1, 1, 1);
> >
> >     imageData->AllocateScalars();
> >
> >     imageData->GetPointData()->GetScalars()->FillComponent(0, 0);
> >
> >     vtkImageViewer2 *imageViewer = vtkImageViewer2::New();
> >
> >     imageViewer->SetInput(imageData);
> >
> >     MyQVTKWidget2 widget(imageViewer);
> >
> >     imageViewer->SetRenderWindow(widget.GetRenderWindow());
> >
> >     QMainWindow mainWindow;
> >
> >     mainWindow.setGeometry(200, 200, 300, 300);
> >
> >     mainWindow.setCentralWidget(&widget);
> >
> >     mainWindow.show();
> >
> >     imageData->Delete();
> >
> >     return a.exec();
> >
> > }
> >
> >
> > On Fri, Feb 24, 2012 at 1:36 PM, Jonathan Morra <jonmorra at gmail.com>
> wrote:
> >>
> >> I will spend some time and try and put together a small self contained
> >> test.
> >>
> >>
> >> On Fri, Feb 24, 2012 at 1:29 PM, Clinton Stimpson <clinton at elemtech.com
> >
> >> wrote:
> >>>
> >>> On Friday, February 24, 2012 02:19:59 pm Jonathan Morra wrote:
> >>> > I have recently converted my app from using QVTKWidget to QVTKWidget2
> >>> > so
> >>> > that I could paint on the QVTKWidget2 (which I was able to
> successfully
> >>> > do).  After this conversion my app started to leak memory terribly.
>  I
> >>> > followed the memory leak around, and found the culprit is the
> following
> >>> > line
> >>> >
> >>> > glTexImage2D(GL_TEXTURE_2D, 0, internalFormat,
> >>> >
> >>> >                    xsize, ysize, 0, format,
> >>> >
> >>> >                    GL_UNSIGNED_BYTE, static_cast<const GLvoid
> >>> > *>(data));
> >>> >
> >>> >
> >>> > Which is in the following function
> >>> >
> >>> >
> >>> > void vtkOpenGLImageSliceMapper::RenderTexturedPolygon(
> >>> >
> >>> >   vtkRenderer *ren, vtkImageProperty *property,
> >>> >
> >>> >   vtkImageData *input, int extent[6], bool recursive)
> >>> >
> >>> >
> >>> > I am using a build that I got from git on January 10th.  I have a 64
> >>> > bit Windows 7 machine, but have built VTK with Microsoft Visual
> >>> > Studios 2008 32 bit.
> >>> >
> >>> >
> >>> > This bug is manifested everytime I call render on a QVTKWidget2 that
> I
> >>> > have placed a vtkImageViewer2 in.  This is a very critical bug for us
> >>> > as now our program runs out of memory very quickly because there are
> >>> > situations where render is called on every mouse move which means the
> >>> > program will die extremely fast.  Any help would be appreciated.
> >>> >
> >>>
> >>> Ok, I see the cause of the problem.
> >>>
> >>> QVTKWidget2::Start() calls OpenGLInit(), which resets the context
> >>> creation
> >>> time and the vtkOpenGLImageSliceMapper reloads them thinking its a new
> >>> context.
> >>>
> >>> It would helpful if you can provide a minimal test case to demonstrate
> >>> this.
> >>>
> >>> --
> >>> Clinton Stimpson
> >>> Elemental Technologies, Inc
> >>> Computational Simulation Software, LLC
> >>> www.csimsoft.com
> >>
> >>
> >
> >
> > _______________________________________________
> > 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
> >
> > Follow this link to subscribe/unsubscribe:
> > http://www.vtk.org/mailman/listinfo/vtkusers
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20120228/8c9fb743/attachment.htm>


More information about the vtkusers mailing list