exponenta event banner

Постоянные массивы mxArray

Можно освободить массив или часть памяти от автоматической очистки 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));
  }
}

См. также

|

Связанные темы