2

我正在使用 Eigen 3.1.2,并且能够毫无问题地构建我的应用程序的 64 位目标。当我构建一个 32 位目标时,我得到了很多“未对齐”的断言。因此,我通过在所有类中定义 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 声明的附加参数。就我而言,我有一个 std::vector指向包含 Eigen 成员的类的指针。我依靠 EIGEN_MAKE_ALIGNED_OPERATOR_NEW 进行对齐分配,并且没有在 std::vector 声明中使用 Eigen::aligned_allocator。

4

2 回答 2

1

尴尬地承认,但 std::_Allocate 中的崩溃与内存不足问题有关。我被愚弄了,以为它们与对齐问题有关。

于 2013-08-07T18:11:28.563 回答
1

Eigen 的文档是指直接使用vectorEigen 对象,而不是指向 Eigen 对象的指针向量。该allocator参数不会传递给shared_ptrs. 由于您必须shared_ptr自己使用堆分配的对象来初始化 [1],因此您有责任以正确的对齐方式进行分配。

[1] http://en.cppreference.com/w/cpp/memory/shared_ptr/shared_ptr

于 2013-08-06T20:29:02.417 回答