WZX's blog 海滩上捡贝壳的孩子

VTK之SmartPointer

2018-11-01
wzx
VTK

VTK 的对象在引用完了之后需要手动 delete,这样很不方便并且可能导致内存泄漏。SmartPointer 就是为了解决这一问题的,如果对象超出作用域,并且不会在其他地方是用来,那么他将会被自动 delete

用SmartPointer创建对象

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

把现有对象放入SmartPointer

使用TakeReference()

vtkPolyData *NewMesh()
{
  vtkPolyData *pd = vtkPolyData::New();
  // build the mesh
  // ...
  return pd;
}

vtkSmartPointer<vtkPolyData> MyObject;
MyObject.TakeReference(NewMesh());

使用Take()

auto MyObject = vtkSmartPointer<vtkPolyData>::Take(NewMesh());

通过SmartPointer获取对象

auto Reader = vtkSmartPointer<vtkXMLPolyDataReader>::New();
//reader超出作用域且不被引用时,pd会被释放内存
vtkPolyData* pd = Reader->GetOutput();

//当reader和pd同时超出作用域时,pd才会被释放内存
vtkSmartPointer<vtkPolyData> pd = Reader->GetOutput();

作为函数返回值使用Smart Pointer

//注意返回类型不要写成普通指针
vtkSmartPointer<vtkPolyData> MyFunction()
{
  auto myObject = vtkSmartPointer<vtkPolyData>::New();
  return myObject;
}

作为类成员使用Smart Pointer

class MyClass
{
  vtkSmartPointer<vtkFloatArray> Distances;
};

//初始化方法一
MyClass::MyClass()
: Distances(vtkSmartPointer<vtkFloatArray>::New())
{}

//初始化方法二
MyClass::MyClass()
{
  Distances = vtkSmartPointer<vtkFloatArray>::New();
}

参考文献:SmartPointers


上一篇 GTest 基本使用

下一篇 Pointer and const

Comments

Content