Когда 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*
функции.