链接外部DLL中std :: vector的Mex动态内存管理问题;分割错误

问题描述

|| 我正在尝试创建一个将MATLAB与与某些硬件通信的外部C ++库接口的mex文件。硬件供应商为我的VC ++版本提供了导入的库和预编译的DLL(.lib和.dll),并且我能够在C ++中实现它们而没有任何问题。 但是,当代码编写为mex(与VC ++的相同版本编译)时,在运行时遇到分段错误。在使用VC ++调试器进行了一些调查之后,可能的罪魁祸首似乎是以下事实:一个外部dll函数返回了数据类型std :: vector,并可能试图为该函数内部某个位置的vector容器动态分配内存。我知道如果我在自己的mex函数中使用std :: vector,则一切正常,但我怀疑mex标头本身将std :: vector容器包装在我自己的代码中,以进行动态管理所需的内存管理(?)以mex代码分配的内存,而对于预编译的.dll则无法做到。 现在的问题是:由于我无法修改外部.dll文件并且无法访问其源文件,因此有任何方法可以使用此外部dll,以便动态内存可以由MATLAB管理(也许是某种包装器)。 。?)...从而避免分段错误并返回正确的数据?或者如果我的分析是错误的,也请纠正我! 如果有任何想法或技巧,请告诉我,谢谢! 我的系统:Windows 7 SP1 32位,MATLAB 2009b,Visual C ++ 2008 Pro。 我还在以下位置发布了相同的问题: http://www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-error  如果您有帐户,也可以在此分享您的见解,谢谢!     

解决方法

        感谢大家的回答和评论。在MathWorks的友好人员的帮助下,我得以解决了该问题。 摘自http://www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-error中的文章:   您可能会看到stl库和/或预编译dll使用的编译器选项与MATLAB和MEX命令使用的选项之间不兼容。 MATLAB 2009b是使用MSVC 2005构建的。      您可能可以通过更改mex所使用的选项或直接使用MSVC构建mex文件来解决该问题。一个可能影响事物的选项的示例是SECURE_SCL = 0。我将首先使用MATLAB用于查找有问题的选项的选项来构建测试程序,然后在构建mex文件时尝试删除该选项。      由于这种不兼容性,在第三方编译库的api中使用stl对象通常不是一个好主意。 按照他的建议,我从以下位置的mex选项文件中删除了SECURE_SCL = 0选项 C:\\ Users \\(用户名)\\ AppData \\ Roaming \\ MathWorks \\ MATLAB \\ R2009b \\ mexopts.bat 然后重新编译mex文件,现在一切都像超级按钮一样工作-该函数返回正确的数据,并且不再发生分段错误。     ,        MEX API对STL容器没有做任何特殊的事情,因为它们无法在MATLAB和MEX函数(唯一可以执行此操作的非原始数据类型是mxArray)之间传递。从根本上说,要确保MTL功能能够正确处理STL容器使用的内存; MATLAB不会跟踪它。 跨DLL边界传递std :: vector有点棘手。我假设供应商会意识到这一点,并为您提供带有正确的declspecs等的适当头文件,但是如果它们没有,您可能希望参考此Microsoft支持链接以了解更多信息。关于什么要求。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...