我正在尝试创建一个将MATLAB与与某些硬件进行通信的外部C++库接口(interface)的mex文件。硬件供应商为我的VC++版本提供了导入的库和预编译的DLL(.lib和.dll),并且我能够在C++中实现它们而没有任何问题。
但是,当代码编写为mex(与VC++的相同版本编译)时,在运行时遇到分段错误。经过VC++调试器的调查后,可能的罪魁祸首似乎是以下事实:一个外部dll函数返回了数据类型std::vector,并可能试图为该函数内部某个位置的vector容器动态分配内存。我知道如果我在自己的mex函数中使用std::vector,则一切正常,但我怀疑mex header 本身将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的原始帖子中:
按照他的建议,我从以下位置的mex选项文件中删除了SECURE_SCL = 0选项
C:\ Users \(用户名)\ AppData \ Roaming \ MathWorks \ MATLAB \ R2009b \ mexopts.bat
然后重新编译mex文件,现在一切都像 super 按钮一样工作-该函数返回正确的数据,并且不再发生分段错误。
关于c++ - 链接的外部DLL中的std::vector的Mex动态内存管理问题;段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6320319/