2014-10-06 87 views
6

我一直在使用本征在我的软件,我今天碰到的一个问题,造成从建立在静态库动态库改变我的代码Windows,使用Visual Studio 2013.此开关的原因与Eigen无关。内存对齐错误2013

我嵌入征在自己的库文件,其本身然后链接到我的应用程序(一个或多个)。如前所述,这个图书馆直到今天一直是一个静态图书馆;我刚更新我的代码库来生成一个DLL文件。

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

功能块在--------------------被由对齐例程分配,使用_aligned_free()

(这个消息每次弹出多次不同的地址;我用上面的破折号,因为我不认为具体的地址与这个问题有关)。

选择“重试”打开调试器对Memory.h

视觉工作室智能感知(未调试时)线255表明,EIGEN_ALIGN和EIGEN_HAS_MM_MALLOC都定义为1,EIGEN_MALLOC_ALREADY_ALIGNED和EIGEN_HAS_POSIX_MEMALIGN都是未定义的。因此,它应该运行_mm_free(ptr),它(基于IntelliSense的再次)是_aligned_free(a)的别名。因此,看起来这个代码应该运行正确的功能,但事实并非如此。

当我更改代码回静态库,这个问题就会消失。

我从众多的Google搜索中发现的唯一远程相关内容是英特尔Fortran编译器的一篇文章,它说这个错误消息可能来自于一个库,它是在早期版本中编译的,并由最新版本编译的代码调用。除了我正在使用Visual Studio C++ 2013的事实之外,我已经多次重新编译代码,以确保它完全从干净状态重新编译,并且此错误消息仍然存在。

我已经从网上下载善变回购(默认分支)最新的代码,但这并没有解决问题。

我试图像彻底,因为我可能会。如果您需要更多信息,请告诉我。

编辑:

此外上下文:

'客户代码',其利用在这种情况下,DLL是谷歌测试;在测试期望值之后引发错误消息 - 即DLL文件中的类正在运行析构函数来清理临时对象。在驱动程序的应用程序,我没有试图做这样的DLL文件分配内存,邪恶的东西,然后解除分配 - 这是部分原因,我觉得这是这么混乱....

+0

你确定DLL和使用该DLL的客户端已经构建相同吗?我正在大声思考 - 现在它是独立的,DLL正在做mallocs并以一种方式释放,客户端可以做其他事情。通常由于这个原因,它不适合客户端在DLL中创建的对象上调用free。通常你从DLL中导出清理(即免费)例程,以便客户端可以调用这些例程而不是直接执行。对象创建也是如此。 – 2014-10-06 19:29:28

+0

@MichaelPetch我很确定他们是一样的。当然,DLL和静态库是相同的(我只改变一个设置)。另外 - 我没有从客户端免费调用 - 有问题的代码是DLL清理代码。就我而言,客户端是Google Test,它正在对库中的代码进行单元测试;在应该调用临时特征矩阵析构函数的地方达到了断点。我会更新这个问题并澄清这一点,以利于他人。我看到这在之前并不清楚。 – 2014-10-06 20:03:48

回答

2

我有这个确切的问题。我将使用Eigen的静态库转换为DLL,并在使用gtest进行单元测试时开始出现这些错误。由于没有解决方案,我会提供我所做的解决问题的方法。本质上,问题在于你已经创建了一个包含Eigen矩阵/向量作为成员变量的类的新接口,并且该接口使用Eigen成员变量创建了一个指向类的指针。首先,如果你有成员变量是特征矩阵或向量,那么你应该阅读this。总之,你需要添加

市民: EIGEN_MAKE_ALIGNED_OPERATOR_NEW

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

现在,我使用EIGEN_MAKE_ALIGNED_OPERATOR_NEW后仍然有问题,这是由于使用原子与特征矩阵类;作为成员变量的boost::atomic<Eigen::MatrixXf>。我想在保证原子性时对齐是非常重要的。