Когда функция MEX возвращает управление MATLAB ®, она возвращает результаты своих вычислений в выходных аргументах - mxArrays, содержащиеся в аргументах слева 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, для управления памятью. Не используйте стандартные аналоги библиотеки Си; это может привести к неожиданным результатам, включая завершение программы.
В этом примере показано, как распределить память для переменных в функции 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* функции.