Можно освободить массив или часть памяти, от MATLAB® автоматическая очистка путем вызова mexMakeArrayPersistent
или mexMakeMemoryPersistent
. Однако, если MEX-функция создает постоянные объекты, то утечка памяти могла произойти, если MEX-функция очищена, прежде чем постоянный объект правильно уничтожается. Чтобы предотвратить утечки памяти, используйте функцию mexAtExit
, чтобы зарегистрировать функцию, чтобы освободить память для объектов, созданных с помощью этих функций.
Следующий код файла MEX создает персистентный массив и правильно избавляется от него.
#include "mex.h" static int initialized = 0; static mxArray *persistent_array_ptr = NULL; void cleanup(void) { mexPrintf("MEX file is terminating, destroying array\n"); mxDestroyArray(persistent_array_ptr); } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { if (!initialized) { mexPrintf("MEX file initializing, creating array\n"); /* Create persistent array and register its cleanup. */ persistent_array_ptr = mxCreateDoubleMatrix(1, 1, mxREAL); mexMakeArrayPersistent(persistent_array_ptr); mexAtExit(cleanup); initialized = 1; /* Set the data of the array to some interesting value. */ *mxGetDoubles(persistent_array_ptr) = 1.0; } else { mexPrintf("MEX file executing; value of first array element is %g\n", *mxGetDoubles(persistent_array_ptr)); } }
mexAtExit
| mexMakeArrayPersistent