我正在浏览VTK 5.4.2代码,似乎无法理解Delete()函数是如何工作的。我的意思是,Delete()函数在vtkObjectBase中是虚拟的,但是,通过什么命令链是vtkDoubleArray类(例如)执行的析构函数?
最好的问候,
mightydodol
答案 0 :(得分:6)
vtkObjectBase Delete()将调用UnRegisterInternal。如果类ReferenceCount小于或等于1,它将在类上调用delete。
答案 1 :(得分:6)
这是一种参考计数垃圾收集器。
如果你看一下vtkObjectBase,有三个函数 - Register,UnRegister和Delete。这些是执行引用计数的那些。
注册实例时,会增加引用计数。取消注册后,它会减少。当参考。计数达到0,它被删除了。使用New()创建对象时,它以引用计数0开始。每次需要它的独立实例时,都会在其上调用Register,并递增ref。计数。 Delete()只是UnRegister()的另一个名称。
如果将对象设置为另一个对象(例如,将vtkPolyData实例设置为算法作为输入),则会将您正在设置的实例(算法)作为父对象调用Register。现在,当删除父(算法)时,会找到它的子项并将其与其一起删除。
还有一种方法可以确保当两个对象相互引用时(例如vtkRenderer和vtkRenderWindow),它们不会进入相互UnRegisters的循环节日,但基本上就是这样。
答案 2 :(得分:1)
另外:您不需要经常调用Delete()。几乎总是可以使用vtkSmartPointer。