智能指针则用来解决这个问题。使用智能指针,用户不必考虑何时进行内存释放,而是由智能指针进行控制。
智能指针
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()函数修改引用计数
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)