VTK中Register函数的妙用
众所周知,VTK中的智能指针vtkSmartPointer给了我们方便操作内存的方法,使我们不用为内存的管理而操心。VTK会自动识别分配的内存是否仍在使用,并且释放已经不再使用的内存。
VTK实现这样的机制与C++11中的智能指针类似,是通过ReferenceCount来实现,简单来说,就是使用ReferenceCount对内存的使用进行计数。
通常有以下几种情况:
(1) 当创建一个类的实例时,该实例的ReferenceCount会设置为1。
(2) 当使用SetInput和GetOutput这样的pipeline来链接类之间的数据流时,输出数据的类,即调用了GetOutput的类的ReferenceCount会自动加一。
(3) 当一个类在局部函数中被使用,而没有加入到pipeline中进行调用。当跳出局部函数后,该类实例的ReferenceCount则会自动减一,直到其为0,自动释放内存。
值得注意的是,上述的自动计数机制只有在VTK的体系中才有用,如果跳出了VTK的体系,在其他地方调用VTK类中的数据,则不会对ReferenceCount产生任何影响。
那么这个时候怎么办呢?
这个时候就要用到vtk类中常见的Register/Unregister的功能。这两个功能可以人为地对vtk类的ReferenceCount进行加一或减一的操作,从而决定该类销毁与否。