今天看ORBSLAM2中的OptimizeEssentialGraph()函數時,對一句代碼中的aligned_allocator不太清楚:
vector<g2o::Sim3,Eigen::aligned_allocator<g2o::Sim3> >
百度查找了一些資料,記錄如下:
如果STL容器中的元素是Eigen的數據結構,例如這里定義一個vector容器,元素是Matrix4d ,如下所示:
vector <Eigen::Matrix4d>;
編譯不會出錯,但在運行的時候出錯。解決的方法很簡單,定義改成下面的方式:
vector<Eigen::Matrix4d,Eigen::aligned_allocator<Eigen::Matrix4d>>;
其實上述的這段代碼才是標准的定義容器方法,只是我們一般情況下定義容器的元素都是C++中的類型,所以可以省略,這是因為在C++11標准中,aligned_allocator管理C++中的各種數據類型的內存方法是一樣的,可以不需要着重寫出來。但是在Eigen管理內存和C++11中的方法是不一樣的,所以需要單獨強調元素的內存分配和管理。