智能指針則用來解決這個問題。使用智能指針,用戶不必考慮何時進行內存釋放,而是由智能指針進行控制。
智能指針
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()函數修改引用計數