Вопрос
Я просматривал код VTK 5.4.2 и не мог понять, как работает функция Delete().Я имею в виду, что функция Delete() находится в vtkObjectBase и является виртуальной, но через какую цепочку команд выполняется деструктор класса vtkDoubleArray (например)?
с наилучшими пожеланиями,
могучийдодол
Решение
vtkObjectBase Delete() вызовет UnRegisterInternal.Если класс ReferenceCount меньше или равен 1, он вызывает удаление класса.
Другие советы
Это своего рода сборщик мусора с подсчетом ссылок.
Если вы посмотрите на vtkObjectBase, то увидите три функции — Register, UnRegister и Delete.Это те, которые выполняют подсчет ссылок.
Когда вы регистрируете экземпляр, это увеличивает количество ссылок.Когда вы отменяете регистрацию, оно уменьшается.Когда исх.счетчик достигает 0, он удаляется.Когда вы создаете объект с помощью New(), он начинается со счетчика ссылок, равного 0.Каждый раз, когда вам нужен независимый экземпляр, вы вызываете его Register, и он увеличивает ссылку.считать.Удалить() — это просто другое имя для UnRegister().
Если вы устанавливаете объект для другого объекта (например, устанавливая экземпляр vtkPolyData для алгоритма в качестве входных данных), он вызывает Register с экземпляром, который вы устанавливаете в (алгоритм), в качестве родительского.Теперь при удалении родителя (алгоритма) его дочерние элементы находятся и удаляются вместе с ним.
Существует также метод, гарантирующий, что они не перейдут в циклический фестиваль взаимных UnRegisters, когда два объекта ссылаются друг на друга (например, vtkRenderer и vtkRenderWindow), но это, по сути, все.
Также:вам не нужно часто вызывать Delete().Вместо этого почти всегда можно использовать vtkSmartPointer.