我正在使用Eigen 3.1.2,我能够毫无问题地构建我的应用程序的64位目标。当我构建一个32位目标时,我得到了很多“未对齐”的断言。所以我跟着workaround在我的所有类中定义了EIGEN_MAKE_ALIGNED_OPERATOR_NEW,并为所有STL容器使用了Eigen :: aligned_allocator。这似乎照顾了所有的断言。但是,在调试模式下,我崩溃了。这是崩溃的地方:
m_container.resize(N)
这是对m_container的调整大小操作,它是std::vector<std::vector<std::vector<pFOO> > >
(pFOO的3D数组),其中pFOO是指向FOO对象的指针。我正在使用pFOO = std::shared_ptr<FOO>
定义指针。此外,FOO类有几个Eigen成员,我在类中定义了一个公共EIGEN_MAKE_ALIGNED_OPERATOR_NEW。 std::shared_ptr<FOO>
默认使用对齐的分配器吗?在调整大小操作时它会崩溃的原因是什么?我还能尝试什么?
编辑: 在Eigen文档中建议的解决方法是,对于包含Eigen成员的类的STL容器,我必须使用Eigen :: aligned_allocator作为std :: vector声明的附加参数。在我的例子中,我有一个包含Eigen成员的类的指针的std :: vector。我依靠EIGEN_MAKE_ALIGNED_OPERATOR_NEW进行对齐分配,而不是在std :: vector声明中使用Eigen :: aligned_allocator。
答案 0 :(得分:1)
Eigen的文档是指直接使用vector
个特征对象,而不是指向特征对象的指针向量。 allocator
参数不会传递给shared_ptr
。由于您必须自己使用堆分配的对象初始化shared_ptr
[1],因此您需要负责分配正确的对齐方式。
[1] http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr
答案 1 :(得分:1)
令人尴尬承认但是std :: _ Allocate中的崩溃与内存不足问题有关。我被骗以为他们与对齐问题有关。