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