自动清理MEX文件中的临时数组
当MEX函数将控制返回给MATLAB时®,它在输出参数中返回其计算结果mxArray
S包含在左边的参数中plhs []
.类创建的数组必须具有临时作用域,因此不要传递使用mexMakeArrayPersistent
函数plhs
.MATLAB破坏了任何mxArray
由不存在的MEX函数创建plhs
.函数释放在MEX函数中分配的任何内存mxCalloc
,mxMalloc
,或mxRealloc
功能。
MathWorks®建议MEX函数销毁自己的临时数组并释放自己动态分配的内存。在源MEX文件中执行这种清理比依赖于自动机制更有效。然而,有几种情况下,MEX函数不能达到其正常的返回语句。
如果出现以下情况,则未达到正常返回值:
MATLAB调用
mexCallMATLAB
被调用的函数会创建一个错误。源MEX文件可以通过使用mexCallMATLABWithTrap
函数,但并不是所有的MEX文件都需要捕获错误。)日志含义用户使用中断MEX功能执行Ctrl + C.
MEX功能内存不足。处理步骤MATLAB内存不足处理程序终止MEX函数。
在第一种情况下,MEX程序员可以确保在返回前安全清理临时数组和内存,但在最后两种情况下则不然。自动清理机制对于防止这些情况下的内存泄漏是必要的。
您必须使用matlab提供的函数,例如mxCalloc
而且mxFree
,以管理内存。不要使用标准C库对应版本;这样做可能会产生意想不到的结果,包括程序终止。
例子
这个例子展示了如何在MEX函数中为变量分配内存。例如,如果函数的第一个输入(prhs [0]
)是一个字符串,要操作字符串,创建一个缓冲区缓冲区
的大小buflen
.下面的语句声明这些变量:
char *缓冲区;int buflen;
缓冲区的大小取决于输入数组的维数和数组中数据的大小。这个语句计算的大小buflen
:
buflen = mxGetN(prhs[0])*sizeof(mxChar)+1;
接下来,为分配内存缓冲区
:
buf = mxMalloc(buflen);
在程序结束时,如果您没有返回缓冲区
作为一个plhs
输出参数,然后释放其内存,如下所示:
mxFree (buf);
在退出MEX函数之前,请销毁临时数组并释放动态分配的内存mxArray
在输出参数列表中返回,由mexGetVariablePtr
,或用来创建一个结构。另外,永远不要删除输入参数。
使用mxFree
方法分配的内存mxCalloc
,mxMalloc
,或mxRealloc
功能。使用mxDestroyArray
方法分配的内存mxCreate *
功能。