C emxFree\u real\T导致可执行文件中止

C emxFree\u real\T导致可执行文件中止,c,matlab,matlab-coder,C,Matlab,Matlab Coder,我正在使用Matlab编码器,使用coder.varsize中指出的可变大小变量。这将导致使用类型emxArray\u real\u T声明一些变量,使用emxInit\u real\u T初始化,与对emxEnsureCapacity\u real的适当调用一起使用,最后使用emxFree\u real\u T释放 我有几个函数会发生这种情况,但有时,由于无法很好地隔离的原因,emxFree\u real\t操作会导致编译后的可执行文件中止,显示回溯和内存映射,这对我来说似乎没有帮助。这是可以

我正在使用Matlab编码器,使用
coder.varsize
中指出的可变大小变量。这将导致使用类型
emxArray\u real\u T
声明一些变量,使用
emxInit\u real\u T
初始化,与对
emxEnsureCapacity\u real
的适当调用一起使用,最后使用
emxFree\u real\u T
释放

我有几个函数会发生这种情况,但有时,由于无法很好地隔离的原因,
emxFree\u real\t
操作会导致编译后的可执行文件中止,显示回溯和内存映射,这对我来说似乎没有帮助。这是可以猜测的,因为它发生在可变大小数组停止使用时(因此可以取消分配)

通过对C代码的操作,我可以判断错误是在调用
emxFree\u real\T
函数时发生的。注释掉这些行可以使生成的代码正常工作。但这似乎既不安全,也无法解决我的问题

不幸的是,这个错误很难重现,所以我无法给出一个最低限度的工作示例

这是已知的bug吗?关于可变大小数组的使用,我遗漏了一些东西


Matlab版本是R2019a。

问题可能有多种原因,调查的出发点是启用选项
cfg。运行时检查
,正如@RyanLivingston所指出的。调试生成的代码时还有其他步骤

在这种情况下,
%#codegen
指令已经禁止用户通过以下方式增加数组的大小来动态分配内存:

myArray(end+1) = rand();
但是,如果代码将其实现为:

for i:1:a
    myArray(i) = rand();
end
然后它可能无法知道参数
a
将超过
myArray
的大小,并且在每个步骤中,它都不会使用
emxEnsureCapacity
增加其大小。添加
cfg.RuntimeChecks
将创建一个异常处理案例,该案例将精确定位此事件

解决方法是将较大的变量分配给
myArray
,例如:

myArray = zeros(a,1); 
for i:1:a
    myArray(i) = rand();
end

即使以前定义的
myArray
的大小较小(但通过
coder.varsize
设置为大小可变),也可以确保增加的容量,并且循环可以继续进行。

内存损坏时会发生这种情况很常见。看看他们是否给了你任何信息,特别是检查运行时错误。@RyanLivingston有关信息,我已经在生成、编译和运行独立代码了。建议首先创建mex函数,这是为什么?另外,启用带有
-Wall
的编译器警告并使用运行时错误检查只会产生一条消息“
%lld
需要
long long int
类型的参数,但参数3的类型为
long int
[-Wformat]”,这发生在NNN_rtwutil函数中。运行时错误检查。默认情况下,独立代码没有这些检查。因此,如果你的MATLAB代码做了一些非法的事情,比如索引越界,生成的代码将具有未定义的行为、损坏的内存等。我发送的链接中的
cfg.RuntimeChecks
选项将启用对独立代码的那些检查。试着打开它并运行你的独立代码来检查错误。@RyanLivingston:我已经解决了我的问题,但是你的提示是正确的。请随意编辑我的答案或根据我写的内容添加您自己的答案。如果你这样做,我会接受你的回答。