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

Когда 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, управлять памятью. Не используйте дубликаты стандартной библиотеки для 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* функции.

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

|

Похожие темы