我一直在使用本征在我的软件,我今天碰到的一个问题,造成从建立在静态库动态库改变我的代码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文件分配内存,邪恶的东西,然后解除分配 - 这是部分原因,我觉得这是这么混乱....
你确定DLL和使用该DLL的客户端已经构建相同吗?我正在大声思考 - 现在它是独立的,DLL正在做mallocs并以一种方式释放,客户端可以做其他事情。通常由于这个原因,它不适合客户端在DLL中创建的对象上调用free。通常你从DLL中导出清理(即免费)例程,以便客户端可以调用这些例程而不是直接执行。对象创建也是如此。 – 2014-10-06 19:29:28
@MichaelPetch我很确定他们是一样的。当然,DLL和静态库是相同的(我只改变一个设置)。另外 - 我没有从客户端免费调用 - 有问题的代码是DLL清理代码。就我而言,客户端是Google Test,它正在对库中的代码进行单元测试;在应该调用临时特征矩阵析构函数的地方达到了断点。我会更新这个问题并澄清这一点,以利于他人。我看到这在之前并不清楚。 – 2014-10-06 20:03:48