可能的内存泄漏原因是 PCL 可视化程序和 QVTK 小部件的组合、占用和使用了大量的内存。具体来说,在使用vtkRenderWindowInteractor对QVTKWidget进行渲染时,每次进行一帧渲染时,它会向每一帧添加新的渲染器,并不断地添加新的渲染器,导致内存泄漏。解决此问题的一种方法是,在渲染器添加到渲染窗口之前,您需要确保在上一帧之前已经将渲染器从渲染窗口中移除。
PCL 可视化程序中使用的vtkRenderWindowInteractor是在pcl::visualization::PCLVisualizer类中创建的,因此,你需要根据下面的代码片段来修改你的代码来解决内存泄漏:
pcl::visualization::PCLVisualizer viewer("PCL Viewer");
viewer.initCameraParameters();
// Get vtkRenderWindow and remove Interactor
vtkSmartPointer<vtkRenderWindow> renderWindow = viewer.getRenderWindow();
vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = renderWindow->GetInteractor();
if (renderWindowInteractor != nullptr)
{
renderWindowInteractor->Stop();
renderWindow->Finalize();
}
// Create new Interactor and start rendering
renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
viewer.setupInteractor(renderWindowInteractor, renderWindow);
viewer.addPointCloud(cloud, "cloud");
viewer.spinOnce();
// Clean up and reset for next run
viewer.resetStoppedFlag();
renderWindowInteractor->Start();
renderWindowInteractor->Delete();
在此更改中,您可以看到我们在每次迭代后删除了渲染器,并使用新的vtkRenderWindow对象进行渲染。这种方法可以确保内存泄漏问题得到完美解决。