Вопрос

Я просматривал код 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top