Когда MEX-функция возвращает управление в MATLAB®, это возвращает результаты своих вычислений в выходных аргументах — mxArray
s содержавшийся в аргументах plhs[]
левой стороны. Эти массивы должны иметь временный осциллограф, не передавайте массивы, созданные с функцией mexMakeArrayPersistent
в plhs
. MATLAB уничтожает любой mxArray
, созданный MEX-функцией, которая не находится в plhs
. MATLAB также освобождает любую память, которая была выделена в 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]
) является строкой, чтобы управлять строкой, создайте буферный buf
размера buflen
. Следующие операторы объявляют эти переменные:
char *buf; int buflen;
Размер буфера зависит количество размерностей вашего входного массива и размера данных в массиве. Этот оператор вычисляет размер buflen
:
buflen = mxGetN(prhs[0])*sizeof(mxChar)+1;
Затем, выделите память для buf
:
buf = mxMalloc(buflen);
В конце программы, если вы не возвращаете buf
как выходной параметр plhs
, затем освобождают его память можно следующим образом:
mxFree(buf);
Прежде, чем выйти из MEX-функции, уничтожьте временные массивы и свободную динамически выделенную память, кроме того, если такой mxArray
возвращен в списке выходных аргументов, возвращенном mexGetVariablePtr
, или раньше создавал структуру. Кроме того, никогда не удаляйте входные параметры.
Используйте mxFree
, чтобы освободить память выделенный mxCalloc
, mxMalloc
или функциями mxRealloc
. Используйте mxDestroyArray
, чтобы освободить память выделенный функциями mxCreate*
.