我正在瀏覽VTK 5.4.2代碼,似乎無法理解Delete()函數如何工作。我的意思是,Delete()函數在vtkObjectBase中並且是虛擬的,但是通過什麼樣的命令鏈來執行vtkDoubleArray類的析構函數?VTK刪除()和數據刪除
最好的問候,
mightydodol
我正在瀏覽VTK 5.4.2代碼,似乎無法理解Delete()函數如何工作。我的意思是,Delete()函數在vtkObjectBase中並且是虛擬的,但是通過什麼樣的命令鏈來執行vtkDoubleArray類的析構函數?VTK刪除()和數據刪除
最好的問候,
mightydodol
vtkObjectBase刪除()將調用UnRegisterInternal。如果類ReferenceCount小於或等於1,它將調用類的刪除。
這是一種引用計數垃圾收集器。
如果你看看vtkObjectBase,有三個函數 - 註冊,取消註冊和刪除。這些是執行參考計數的那些。
當您註冊實例時,它會增加引用計數。當您取消註冊時,它會減少。當參考。計數達到0,它被刪除。當你使用New()創建一個對象時,它以引用計數爲0開始。每次你想要一個獨立的實例時,你就可以調用Register,並且它會增加ref。計數。 Delete()是UnRegister()的另一個名稱。
如果您將對象設置爲另一個對象(例如將vtkPolyData實例設置爲算法作爲輸入),它會將您設置的實例(算法)作爲父對象調用Register。現在,當父母(算法)被刪除時,它的孩子被找到並隨之刪除。
當兩個對象互相引用時(例如vtkRenderer和vtkRenderWindow),還有一種方法可以確保它們不會進入相互UnRegisters的循環節點,但基本上就是這樣。
另外:你不需要經常調用Delete()。幾乎總是可以使用vtkSmartPointer來代替。