主要内容

自动清理MEX文件中的临时数组

当MEX函数将控制返回给MATLAB时®,它在输出参数中返回其计算结果mxArrayS包含在左边的参数中plhs [].类创建的数组必须具有临时作用域,因此不要传递使用mexMakeArrayPersistent函数plhs.MATLAB破坏了任何mxArray由不存在的MEX函数创建plhs.函数释放在MEX函数中分配的任何内存mxCallocmxMalloc,或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方法分配的内存mxCallocmxMalloc,或mxRealloc功能。使用mxDestroyArray方法分配的内存mxCreate *功能。

另请参阅

|

相关的话题