这几天在写VO,需要实现一个功能,将二维坐标点按坐标放在平面上的网格里。这个功能很简单,但是为了节约一点内存,我打算将坐标点的指针放到网格里面,需要的时候用指针操作即可:
vector< vector <vector <keypoint*> > > cells;
然而在实际使用的时候却发现,有一大批的点的坐标居然被修改了。我非常确定的一点就是没有地方可以修改坐标值。这时候意识到,在提取了这些特征点之后,我将所有的点都放在了一个vector中,而当存放所有坐标点的vector删除某一元素时,后续的所有点的地址都会发生改变,故在网格中存储点的坐标很容易造成存储了一个野指针。
修改方法:
第一,将cells改为
vector< vector <vector <keypoint> > > cells;
第二,将存储所有特征的的vector改为存储坐标点的指针,然后将所有的特征点都单独new,这样可以保证不改变特征点的地址。
2019年2月1日15点26分记
本文分享了在视觉里程计(VO)项目中,使用三维向量存储关键点时遇到的野指针问题及解决方案。作者最初尝试通过存储关键点指针来节省内存,但在vector调整大小时导致地址变动,从而产生野指针。最终,通过直接存储关键点而非指针,以及将所有特征点独立new的方式解决了这一问题。
1967

被折叠的 条评论
为什么被折叠?



