VTK在最新的版本中加入了内存泄漏检测功能,详细的编译过程查看Mac中编译、安装VTK_vtk 安装 mac-CSDN博客,本文讲述新版本新功能的编译要点
1、编译Debug版本,CMake中设置以下编译选项
(1)打开内存泄露检测功能 VTK_DEBUG_LEAKS 勾选;
(2)因多个中间的lib会依赖VTK,所以将VTK编译成静态库,否则最后链接成exe的时候一些在头文件中定义的接口会报错重复定义 BUILD_SHARED_LIBS 取消勾选
(3)VTK_SMP_ENABLE_STDTHREAD 取消勾选;VTK_SMP_ENABLE_TBB 取消勾选;
VTK_SMP_ENABLE_OPENMP 和 VTK_SMP_ENABLE_SEQUENTIAL 二选一勾选,本人勾选了后者,否则会出现有些编译失败,影响INSTALL的执行
2、设置环境变量VTK_DEBUG_LEAKS_TRACE_CLASSES,将其值设置为想要打印调用堆栈的类名,多个的话以逗号隔开,例如vtkPolyData,vtkActor2D
3、在程序关闭后,会将有内存泄漏的对象及其创建的堆栈打印到控制台上。
注意事项:如果修改环境变量VTK_DEBUG_LEAKS_TRACE_CLASSES的值后,需要重启VS才能使其生效。
结果:VTK最后检测出内存泄漏的都是以下方式创建的对象
vtkSmartPointer<vtkCubeSource> testS = vtkCubeSource::New();
而通过智能指针的方式创建的对象则没有问题
vtkSmartPointer<vtkCubeSource> testS = vtkSmartPointer<vtkCubeSource>::New();
所以,其实通过代码的静态检查效率更高!