Когда 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 out-of-memory завершает 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*
функций.