使用Visual Studio 2013的动态库使用Eigen时出现内存对齐错误
Memory alignment errors using Eigen with a dynamic library with Visual Studio 2013
我一直在软件中使用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作为成员变量。我认为在保证原子性时,对齐是非常重要的。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- Eigen如何在容器循环中干净地附加矩阵
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 当在带有Eigen的C++中使用GDB时,我如何才能看到更多的大矩阵
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 内存效率-EIGEN :: vectorxd在循环中
- 从一个内存的一个块创建许多eigen :: vectorxd
- 如何从eigen :: matrix获取内存所有权
- 从eigen :: vectorxd获取矩阵视图/块而无需复制(共享内存)
- 使用Eigen和boost::线程的C++中出现奇怪的内存泄漏
- 使用 std::vector<Eigen::MatrixXd 进行内存管理>
- 使用Visual Studio 2013的动态库使用Eigen时出现内存对齐错误
- Eigen+std::vector+OpenMP的内存泄漏
- 如何为正在增长的Eigen::MatrixXd预分配内存