【发布时间】:2019-07-29 20:45:07
【问题描述】:
我正在使用 Matlab 编码器,使用 coder.varsize 指出的可变大小变量。这会导致使用emxArray_real_T 类型声明一些变量,使用emxInit_real_t 进行初始化,通过对emxEnsureCapacity_real 的适当调用使用,最后使用emxFree_real_T 释放。
我有几个函数会发生这种情况,但有时,由于我无法很好地隔离,emxFree_real_T 操作会导致编译的可执行文件中止,显示回溯和内存映射,这似乎对我。这可以猜到,因为它发生在可变大小的数组停止使用时(因此可以取消分配)。
通过操作 C 代码,我可以看出错误恰好发生在对 emxFree_real_T 函数的调用上。注释掉这些行可以使生成的代码正常工作。但这似乎既不安全,也无法解决我的问题。
不幸的是,这个错误很难重现,所以我想不出一个最小的工作示例。
这是一个已知的错误吗?我是否遗漏了有关可变大小数组使用的一些内容?
Matlab 版本为 R2019a。
【问题讨论】:
-
这种情况很常见,因为内存损坏。看看these debugging steps 看看他们是否给你任何信息,尤其是检查运行时错误。
-
@RyanLivingston 有关信息,我已经在生成、编译和运行独立代码。 flowchart in your link 建议首先创建 mex 函数,这是为什么呢?
-
此外,使用
-Wall启用编译器警告并使用运行时错误检查仅产生消息“%lld需要long long int类型的参数,但参数3 的类型为long int[-Wformat]",发生在 NNN_rtwutil 函数中。 -
运行时错误检查。默认情况下,独立代码没有这些检查。因此,如果您的 MATLAB 代码做了一些非法的事情,例如索引越界,生成的代码将具有未定义的行为、损坏的内存等。我发送的链接中的
cfg.RuntimeChecks选项将启用对独立代码的这些检查。尝试打开它并运行您的独立代码以检查错误。 -
@RyanLivingston :我已经解决了我的问题,但你的提示是正确的。随意编辑我的答案或根据我写的内容添加您自己的答案。如果你这样做,我会接受你的正确答案。
标签: c matlab matlab-coder