使用Visual Studio 2013的动态库使用Eigen时出现内存对齐错误

Memory alignment errors using Eigen with a dynamic library with Visual Studio 2013

本文关键字:Eigen 内存 错误 对齐 Studio Visual 2013 动态 使用      更新时间:2023-10-16

我一直在软件中使用Eigen,今天我遇到了一个问题,原因是使用Visual Studio 2013在Windows中将代码从构建静态库更改为动态库。这种转换的原因与Eigen无关。

我将Eigen嵌入到我自己的库文件中,然后将其本身链接到我的应用程序中。如前所述,直到今天,这个库一直是一个静态库;我刚刚更新了我的代码库,生成了一个DLL文件。

由于进行了此更改,我现在从Visual Studio收到以下错误消息:

位于--------------------的块由对齐的例程分配,请使用_aligned_free()

(这条消息每次都会以不同的地址弹出多次;我在上面使用了短划线,因为我不认为具体的地址与这个问题有关)。

选择"重试"打开调试器到Memory.h 上的第255行

Visual studio IntelliSense(未调试时)建议将EIGEN_ALIGN和EIGEN_HAS_MM_MALLOC都定义为1,EIGEN_MALLOC_ALLREADY_ALIGNED和EIGEN_AAS_POSIX_MEMBALIGN都未定义。因此,它应该运行_mm_free(ptr),它(同样基于IntelliSense)是_aligned_free(a)的别名。因此,这段代码似乎应该运行正确的函数,但事实并非如此。

当我将代码改回静态库时,这个问题就消失了。

我在谷歌的大量搜索中发现,唯一与此无关的是"英特尔Fortran编译器"的一篇文章,该文章称,此错误消息可能来自一个在早期版本中编译的库,该库由使用最新版本编译的代码调用。除了使用Visual Studio C++2013这一事实之外,我还多次重新构建了代码,以确保所有代码都从干净的状态完全重新编译,并且此错误消息仍然存在。

我已经从mercurial repo(默认分支)下载了最新的代码,但这并没有解决问题。

我已经尽力做到面面俱到了。如果你需要更多信息,请告诉我。

编辑:

进一步的上下文:

在这种情况下,使用DLL的"客户端代码"是Google Test;在测试一个期望之后,即DLL文件中的类正在运行析构函数以清除临时对象,会引发错误消息。我并没有试图做一些邪恶的事情,比如在DLL文件中分配内存,然后在驱动程序应用程序中取消分配——这就是为什么我觉得这很令人困惑的部分原因。。。。

我遇到了这个问题。我将使用Eigen的静态库转换为DLL,并在使用gtest进行单元测试时开始出现这些错误。由于没有解决方案,我将提供我为解决该问题所做的工作。从本质上讲,问题是您创建了一个新的接口,该接口指向包含作为成员变量的特征矩阵/向量的类,并且该接口会创建一个指向包含特征成员变量的类的指针。

首先,如果你有成员变量,它们是特征矩阵或向量,那么你应该读这个。总之,您需要添加

公共:本征_MAKE_ALIGNED_OPERATOR_NEW

将Eigen用作成员变量的类定义。如果您使用Visual Studio编译器,可能还会收到有关warning C4316: object allocated on the heap may not be aligned 16的警告。

现在,在我使用EIGEN_MAKE_ALIGNED_OPERATOR_NEW之后,我仍然有问题,这是由于使用了具有特征矩阵类的atomic;CCD_ 3作为成员变量。我认为在保证原子性时,对齐是非常重要的。