Автоматическая очистка Временных массивов

Когда 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*.

Смотрите также

|

Похожие темы