【问题标题】:Mex dynamic memory management issue with std::vector in linked external DLL; Segmentation error链接外部 DLL 中 std::vector 的 Mex 动态内存管理问题;分割错误
【发布时间】: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


【解决方案1】:

感谢大家的回答和cmets。在 MathWorks 友好人士的帮助下,我得以解决了这个问题。

来自http://www.mathworks.com/matlabcentral/answers/9294-mex-dynamic-memory-management-issue-with-std-vector-in-linked-external-dll-segmentation-error 的原始帖子:

您可能发现预编译的 dll 使用的 stl 库和/或编译器选项与 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 文件,现在一切都像魅力一样工作 - 函数返回正确的数据并且不再出现分段错误。

【讨论】:

    【解决方案2】:

    MEX API 不会对 STL 容器做任何特殊的事情,因为它们不能在 MATLAB 和 MEX 函数之间传递(唯一可以做到这一点的非原始数据类型是 mxArray)。基本上由 MEX 函数来确保 STL 容器使用的内存得到正确处理; MATLAB 不跟踪它。

    跨 DLL 边界传递 std::vector 有点棘手。我假设供应商会意识到这一点,并为您提供具有正确 declspecs 等的适当头文件,但如果他们没有,您可能需要参考this Microsoft support link 以了解更多关于什么是必填。

    【讨论】:

    猜你喜欢
    • 2010-10-14
    • 2010-10-14
    • 1970-01-01
    • 2015-01-25
    • 2015-04-08
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多