4

我正在浏览 VTK 5.4.2 代码,但似乎无法理解 Delete() 函数是如何工作的。我的意思是,Delete() 函数在 vtkObjectBase 中并且是虚拟的,但是,通过什么命令链执行 vtkDoubleArray 类的析构函数(例如)?

最好的祝福,

威多多

4

3 回答 3

7

它是一种引用计数垃圾收集器。

如果你看一下 vtkObjectBase,有三个函数——Register、UnRegister 和 Delete。这些是执行引用计数的那些。

注册实例时,它会增加引用计数。当您取消注册时,它会减少。当参考。计数达到 0,它被删除。当你使用 New() 创建一个对象时,它的引用计数为 0。每次你想要一个独立的实例时,你调用 Register ,它会增加 ref。数数。Delete() 只是 UnRegister() 的另一个名称。

如果您将一个对象设置为另一个对象(例如,将一个 vtkPolyData 实例设置为一个算法作为输入),它会调用 Register 并将您设置为(算法)的实例作为父对象。现在,当父(算法)被删除时,它的子被找到并连同它一起被删除。

还有一种方法可以确保当两个对象相互引用时(例如 vtkRenderer 和 vtkRenderWindow),它们不会进入相互 UnRegisters 的循环节日,但基本上就是这样。

于 2012-02-16T07:26:58.760 回答
5

vtkObjectBase Delete() 将调用 UnRegisterInternal。如果类 ReferenceCount 小于或等于 1,它将在该类上调用 delete。

于 2009-09-03T13:50:09.500 回答
1

另外:您不需要经常调用 Delete() 。几乎总是可以使用 vtkSmartPointer 代替。

于 2013-04-29T16:26:14.320 回答