因为eigen库分配内存的问题,所以使用eigen库时,如下两种情况要注意
1. 自定义的类中包含 eigen::Matrix4d 等固定尺寸的类型
参考:eigen官方说明
例如:
class Foo
{
...
Eigen::Vector2d v;
...
};
...
Foo *foo = new Foo;
需要将 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 插入到代码中:
class Foo
{
...
Eigen::Vector4d v;
...
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
...
Foo *foo = new Foo;
2. 当STL容器中元素类型为 eigen::Matrix4d 等类型时
参考:官方文档
例如:
std::map<int, Eigen::Vector4d>
// 应该写成如下形式
std::map<int, Eigen::Vector4d, std::less<int>,
Eigen::aligned_allocator<std::pair<const int, Eigen::Vector4d> > >
为什么是这种形式?查看 C++ STL 源码发现,std::map的初始化函数如下:
template <typename _Key, typename _Tp, typename _Compare = std::less<_Key>,
typename _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
class map
{
.....
}
相当于需要显示指定最后一个参数。
同样的,std::unordered_map 如下:
std::unordered_map<double, Eigen::Matrix4d>
// 应该写成如下:
std::unordered_map<double, Eigen::Matrix4d,
std::hash<double>,
std::equal_to<double>,
Eigen::aligned_allocator<std::pair<const double, Eigen::Matrix4d> > >
// C++ STL 源码
template<class _Key, class _Tp,
class _Hash = hash<_Key>,
class _Pred = std::equal_to<_Key>,
class _Alloc = std::allocator<std::pair<const _Key, _Tp> > >
class unordered_map
{
.....
}
3. 额外的一种情况:STL 元素类型为 自定义的类,这个类中包含了 eigen 类型 成员变量
例如:
class Foo
{
...
Eigen::Vector2d v;
...
};
std::map<int, Foo> my_map;
应该写成:
class Foo
{
...
Eigen::Vector4d v;
...
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
std::map<int, Foo*> my_map;
// 注意:std::map 中必须是 Foo* 指针,而不能是Foo
// 猜测原因:只有Foo* , 才会使用new操作,进而使 class Foo
// 中的 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 起作用。