Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.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++ 使用带Visual Studio 2013的动态库的Eigen时出现内存对齐错误_C++_Memory Management_Visual Studio 2013_Eigen - Fatal编程技术网

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

C++ 使用带Visual Studio 2013的动态库的Eigen时出现内存对齐错误,c++,memory-management,visual-studio-2013,eigen,C++,Memory Management,Visual Studio 2013,Eigen,我一直在我的软件中使用Egen,今天我遇到了一个问题,这是由于使用Visual Studio 2013在Windows中将代码从构建静态库更改为动态库引起的。这种转换的原因与本征无关 我将Eigen嵌入到我自己的库文件中,然后将其自身链接到我的应用程序中。如前所述,直到今天,这个库还是一个静态库;我刚刚更新了代码库,生成了一个DLL文件 进行此更改后,我现在从Visual Studio收到以下错误消息: 位于------------------的块是由对齐的例程分配的,请使用\u aligned

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

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

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

位于------------------的块是由对齐的例程分配的,请使用\u aligned\u free()

(这条消息会多次弹出,每次都有不同的地址;我在上面使用了破折号,因为我不认为具体的地址与此问题相关)

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

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

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

我在众多谷歌搜索中发现的唯一一件与此无关的事情是英特尔Fortran编译器(英特尔Fortran编译器)的一篇文章,文章中说,此错误消息可能来自一个库,该库是在早期版本中编译的,由使用最新版本编译的代码调用。除了使用VisualStudioC++ 2013的事实之外,我已经多次重建代码以确保它完全从干净状态重新编译,并且这个错误消息仍然存在。 我已经从mercurial repo(默认分支)下载了最新的代码,但这并没有解决问题

我已经尽力做到尽可能彻底。如果你需要更多的信息,请告诉我

编辑:

进一步背景:


在本例中使用DLL的“客户端代码”是Google Test;在测试一个期望值(即DLL文件中的类正在运行析构函数以清理临时对象)后,将引发错误消息。我并不是在试图做邪恶的事情,比如在DLL文件中分配内存,然后在驱动程序应用程序中取消分配内存——这就是我发现这一点如此令人困惑的部分原因……

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

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

公众: 特征值\u使\u对齐\u运算符\u新

在类定义中使用Eigen作为成员变量。您可能还会收到关于
警告C4316的警告:如果您使用Visual Studio编译器,则堆上分配的对象可能未对齐16


现在,在我使用了
特征值\u MAKE\u ALIGNED\u OPERATOR\u NEW
之后,我仍然有问题,这是因为使用了带有特征矩阵类的原子<代码>boost::原子作为成员变量。我想,在保证原子性时,对齐是非常重要的。

您确定DLL和使用DLL的客户机是以相同的方式构建的吗?我正在大声地思考——现在DLL在做mallocs和free,而客户端可能在做其他事情,这是分开的。通常由于这个原因,客户端对DLL中创建的对象进行自由调用不是一个好的做法。通常从DLL导出清理(即免费)例程,以便客户端可以调用这些例程,而不是直接执行。对象创建也是如此。@MichaelPetch我很确定它们是一样的。当然,DLL和静态库是相同的(我只更改一个设置)。另外-我不是从客户端免费调用的-所讨论的代码是DLL清理代码。在我的例子中,客户端是GoogleTest,它对库中的代码运行单元测试;断点到达应该调用临时特征矩阵析构函数的点。为了其他人的利益,我将更新问题并澄清这一点。我知道这以前并不清楚。