VTK Smartpointer Новый()

Я использую VTK для визуализации, и мой код полон их умных указателей, например:

vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();

о чем я думал, не следует ли за этим New() следовать позже Delete(). Или ВТК все уничтожает "автоматически". Много раз при использовании Delete() мой код дает сбой. Итак, мне было интересно, должен ли я использовать его в первую очередь и что стоит за New(), общий указатель или что-то в этом роде?


vtk
person ISTB    schedule 22.08.2012    source источник


Ответы (2)


vtkSmartPointer уничтожит объект «автоматически», когда он выйдет за пределы области видимости. В его основе вызывается метод Delete().

Без vtkSmartPointer вам нужно самостоятельно позаботиться о проблемах управления памятью и вызвать Delete(), как показано ниже.

vtkObject* MyObject = vtkObject::New();
MyObject->Delete();

vtkSmartPointer<vtkObject> MyObject = vtkSmartPointer<vtkObject>::New();

См. вики-страницу: http://www.vtk.org/Wiki/VTK/Tutorials/SmartPointers

person Yuan    schedule 22.08.2012
comment
Следует отметить, что в VTK есть несколько других классов интеллектуальных указателей, vtkNew предоставляет объект интеллектуального указателя со строгой областью действия с автоматическим созданием объекта, а vtkWeakPointer предлагает слабую ссылку, где он не будет удалять объект, но вернет null, если объект был удалено в другом месте. - person Marcus D. Hanwell; 08.11.2013

Еще одна альтернатива

vtkSmartPointer<vtkObject> MyObject = vtkSmartPointer<vtkObject>::New();

is

vtkNew<vtkObject> MyObject;

Просто обратите внимание, что при передаче MyObject функциям/методам, которые принимают vtkObject*, вы должны использовать MyObject.GetPointer(), например.

foo->SetObject(MyObject.GetPointer());
person Utkarsh    schedule 01.08.2013