1. 程式人生 > 實用技巧 >VTK vtkSmartPointer 智慧指標詳解

VTK vtkSmartPointer 智慧指標詳解

智慧指標則用來解決這個問題。使用智慧指標,使用者不必考慮何時進行記憶體釋放,而是由智慧指標進行控制。

智慧指標

  VTK中的智慧指標類為vtkSmartPointer,是一個模板類,繼承自vtkSmartPointerSmart類。vtkSmartPointer類中定義一個vtkObjectBase型別的指標物件Object,用於儲存智慧指標中實際生成的物件。

vtkSmartPointer<vtkLight> light1 = vtkSmartPointer<vtkLight>::New();

   vtkSmartPointer中定義了靜態函式New()來生成一個智慧指標物件。該函式根據模板引數型別來生成一個物件,並將其儲存在基類vtkSmartPoitnerBase的成員變數Object中。vtkSmartPointer過載了‘->’操作符,返回實際的模板型別的的物件,因此可以方便的訪問物件的成員函式。如light->SetColor()

vtkSmartPointer<vtkLight> light1 = vtkSmartPointer<vtkLight>::New();
vtkSmartPointer<vtkLight> light2 = light1 ;

  vtkSmartPointer過載了賦值操作符,可以在vtkSmartPointer物件之間進行賦值。在賦值過程中,vtkSmartPointer會自動控制其內部物件指標Object的引用計數加1;上面程式碼中, light1和light2的引用計數最終都等於2。首先light1的vtkLight物件Object呼叫Register()自動將引用計數加1;然後將light2的object指向light1的Object物件。

vtkLight* light3 = vtkLight::New();
vtkSmartPointer<vtkLight> light4 = light3;

可以將一個物件指標賦值給一個智慧指標。light3賦值給light4之後,二者的引用計數都為2;

vtkSmartPointer<vtkLight> light1 = vtkSmartPointer<vtkLight>::New();
vtkLight* light2 = light1 ;

此時light1直接將其內部物件Object返回,因此其引用引數並沒有發生改變。但是這種情況需要注意,如果light1的生命週期結束後,會導致light2懸空,從而引發錯誤。


  當一個智慧指標物件的生命週期結束時,會自動呼叫其解構函式釋放記憶體。在解構函式中會呼叫內部物件object的UnRegister()函式修改引用計數