【发布时间】:2011-06-12 05:26:43
【问题描述】:
我正在尝试创建一个 mex 文件,它将 MATLAB 与与某些硬件通信的外部 C++ 库接口。硬件供应商为我的 VC++ 版本提供了一个导入的库和预编译的 DLL(.lib 和 .dll),我能够在 C++ 中毫无问题地实现它们。
但是,当代码编写为 mex(使用相同版本的 VC++ 编译)时,我在运行时遇到了分段错误。在使用 VC++ 调试器进行一些调查之后,可能的罪魁祸首似乎是外部 dll 函数之一返回数据类型 std::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 .如果您有帐户,也可以在那里分享您的见解,谢谢!
【问题讨论】:
-
无论 mex 是什么,您似乎都需要阅读它的文档。包装器工具通常具有关于内存管理的可配置策略。
标签: c++ matlab dll segmentation-fault mex