有时候会出现这种情况:“我的程序编译过了,链接也O了,但是New()缺返回了NULL”。
标准C++, New失败会抛出bad_alloc异常,但是有些编译器对C++支持不是很好,New失败可能不会抛出异常,而是返回0。较好的编程习惯为:
// 这样如果 new 失败了,就不会抛出异常,而是返回空指针
int* p = new (std::nothrow) int;
if ( NULL == p )
return -1;
VTK项目用CMake生成时,会使用标准的find_package(VTK)和include(${VTK_USE_FILE}),程序运行的时候也不会出错,(这些命令会自动给程序中添加定义 - 宏命令)。如果项目的新建不是使用CMake,需要结合模块实现指南。
工厂方法要求在VTK配置时自动添加相关的模块。在不使用CMake生成解决方案时,为了使用不同的模块,需要定义一些宏。
2013年9月10号,(不知谁还是哪里?估计是官方)发布了一下宏命令,这个新的宏命令可以简化上面这个程序,应用中的一个源程序需要添加下面一段代码(用这个,所有的模块都应该会被初始化)
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
这个片段代码会初始化vtkRenderingOpenGL这个对象工厂,其他的模块应该也是的。如果是VTK之前的版本(6.0或者是这个时间之前的版本),你可以在所有VTK头文件之前添加下面一段代码:
#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)
- http://www.vtk.org/pipermail/vtkusers/2013-April/128255.html (已经无效了)
- https://github.com/Kitware/VTK/commit/9385718b82e6af83b7e7dcc90a937419edc6892b
- http://www.vtk.org/pipermail/vtkusers/2013-March/127811.html
遇到NULL指针时,可以让程序不编译,直接跳出来。这一步需要做一些选择(在window中,Visual studio 2008 V9 中项目右键菜单中: 属性页-->预定义)【这段不知道对错,下面的不翻译了没有意义】
PLUS: 还没有找到win7 x64 + VTK 7.0.0中需要用到的相关宏