最近测试中发现,电脑运行一定时间就会重启,检查后发现其实是内存被占满了,然后电脑就卡住,这时会有两种情况:
- 重启
- 把某些程序kill掉释放内存,这个时候不一定会kill那些占很多内存的程序
然后接着查,发现其实就是处理点云的一个程序,注册了内存地址,没有在使用完后释放掉,所以就一直再不停的注册,导致最后内存爆了。
所以解决方法也很简单,只要记得在注册和使用完后,释放就可以避免这种问题了:
// register memory
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_o (new pcl::PointCloud<pcl::PointXYZ>);
//...
// release memory according to the pointer
cloud_o.reset(new pcl::PointCloud<pcl::PointXYZ>());
记住reset()
括号里的点云类型,根据注册的时候类型来定,注册的类型和释放的类型保持一致即可,如pcl::PointXYZI
,pcl::PointXYZRGB
,pcl::PointXYZL
这些类型。
养成内存管理的习惯,可以避免后期测试中很多奇奇怪怪的问题,有时从现象看本质,真的很难。