Автоматическая очистка временных массивов в файлах 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 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* функций.

См. также

|

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте