由于三维扫描软件涉及大量的数据结构及系统资源,而C/C++语言在内存分配与垃圾回收方面,过分依赖于程序员的编程能力,在进行大型程序开发时,极易产生内存泄露或数据访问失败等异常情况。传统的C++指针在执行复制操作时,只复制了指针的地址,对指针所指对象并没有进行复制操作,若开发人员在其他地方将该块内存释放,则其他指向该内存的指针将成为"悬垂指针",对其访问则会产生极其严重的后果,造成程序崩溃。对于某些简单的数据结构,当数据量不大时,使用传值的方式对其进行操作,可以避免由不恰当指针操作引发的问题,但对于本系统而言,一方面,由于传值操作每次都将对数据进行拷贝,对于占用空间较大的变量而言,其时间效率和空间效率难以接受。另一方面,使用值的方式进行数据操作,每次操作的对象都是原数据的备份,若同步不当则会造成数据的不一致。
通过智能指针技术,可以比较好的解决上述问题。利用多个智能指针共享内存中的数据,可以减少空间消耗,提高访问速度,同时可以保证数据不会被过早的释放从而造成"悬垂指针"的问题。智能指针的一种通用实现技术是使用引用计数器(reference count)。智能指针类将一个计数器与指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针,当构造函数调用时,引用计数器加1,当析构函数调用时,引用计数器减一。在赋值时,左操作数引计数器减1而右操作数引用计数器加1。若某个对象引用计数减至,则系统认定该对象不在被使用,执行垃圾回化操作,删除对象并释放内存。
使用了PCL库提供的PointCloud<PointNormal>::Ptr类型指针对点云数据进行管理,使用pcl::PolygonMesh::P化类型指针对曲面数据进行管理,此外还利用OpenCV和boost提供的模板类指针cv::Ptr和boost::shared_ptr定义了其他类型的指针,对软件生命周期内出现的各种对象进行了资源管理。通过使用智能指针对资源进行管理和调度,显著提高了软件的稳定性,简化了程序的运行逻辑。