Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 特征未对齐断言_C++_Visual Studio 2012_Eigen - Fatal编程技术网

C++ 特征未对齐断言

C++ 特征未对齐断言,c++,visual-studio-2012,eigen,C++,Visual Studio 2012,Eigen,我使用的是Eigen 3.1.2,我能够毫无问题地构建我的应用程序的64位目标。当我构建一个32位目标时,我得到了很多“未对齐”的断言。因此,我在所有类中定义了EIGEN_MAKE_ALIGNED_操作符,并对所有STL容器使用EIGEN::ALIGNED_分配器。这似乎已经处理了所有的资产。但是,在调试模式下,我会在某个点崩溃。这里是它崩溃的地方: m_容器。调整大小(N) 这是在m_容器上的调整大小操作,该容器是std::vector(pFOO的3D数组),其中pFOO是指向FOO对象的指针

我使用的是Eigen 3.1.2,我能够毫无问题地构建我的应用程序的64位目标。当我构建一个32位目标时,我得到了很多“未对齐”的断言。因此,我在所有类中定义了EIGEN_MAKE_ALIGNED_操作符,并对所有STL容器使用EIGEN::ALIGNED_分配器。这似乎已经处理了所有的资产。但是,在调试模式下,我会在某个点崩溃。这里是它崩溃的地方:

m_容器。调整大小(N)

这是在m_容器上的调整大小操作,该容器是
std::vector
(pFOO的3D数组),其中pFOO是指向FOO对象的指针。我使用
pFOO=std::shared\u ptr
定义指针。另外,类FOO有几个特征成员,我在类中定义了一个公共特征算子MAKE-ALIGNED-OPERATOR-NEW。默认情况下,
std::shared_ptr
会使用对齐的分配器吗?有什么原因会在调整大小操作时崩溃吗?我还能试什么

编辑:
Eigen文档中建议的解决方法是,对于包含Eigen成员的类的STL容器,我必须使用Eigen::aligned_分配器作为std::vector声明的附加参数。在我的例子中,我有一个指向包含本征成员的类的指针的std::vector。我依靠EIGEN_MAKE_ALIGNED_OPERATOR_NEW来执行对齐分配,而不是在std::vector声明中使用EIGEN::ALIGNED_分配器。

EIGEN的文档是指直接使用EIGEN对象的
向量,而不是指向EIGEN对象的指针向量。
allocator
参数将不会传递给
shared\u ptr
s。由于您必须自己使用堆分配对象[1]初始化
共享\u ptr
,因此您有责任使用正确的对齐方式进行分配


[1] 承认这一点很尴尬,但std::\u分配中的崩溃与内存不足问题有关。我被愚弄到认为它们与对齐问题有关

resize(N)
的哪一行或子例程导致崩溃?@japreis崩溃发生在std::\u在以下行中分配:if(\u Count==0);如果((size_t)(-1)/sizeof(_Ty)<_Count)| |(_Ptr=::运算符new(_Count*sizeof(_Ty))==0)_Xbad_alloc();//报告没有内存,因为它发生在运算符new(),我猜它与使用对齐分配器的Eigen有关。有没有办法,我可以使用提供的分配器来实现此目的?我怎么申报呢?例如,std::vector适用于特征对象的向量,我如何适用于FOO*的向量?我将如何构造自己的分配器?您应该能够通过其接口使用本征分配器。。。但我不是凭经验说话这里有两个问题。。FOO内部本征成员的对齐和FOO*向量的对齐。。。假设本征_MAKE_ALIGNED_运算符_NEW负责重载新运算符。。std::shared_ptr将调用新的重载运算符本身,对吗?这类似于此处面临和解决的问题-->区别在于我不调用make_shared。如何重新分配?