为提高matlab程序运行速度,经常将核心程序编写为mex动态链接库;
然而,经常情况下,在mex函数中分配的内存或句柄希望在mex函数调用完成后在后续函数调用中能够共享而不被释放,本程序方法为解决该问题提供了一种实现方案。
利用mex的C实现方案,为实时应用提供了解决方案。
#include <mex.h> #include <matrix.h> //全局内存空间 static mxArray *persistent_array_ptr[128] = {NULL}; //初始化标记 static long int initialized[128] = {0}; //计数 static int cnt = 0; //当清理时的内存释放函数 void cleanup(void) { mexPrintf("MEX-file is terminating, destroying %d arraies ", cnt); for(int i = 0; i < cnt; i++) if (initialized[i] != -1) mxDestroyArray(persistent_array_ptr[i]); } //mex入口 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { //最大内存共享总数 if (cnt >= 128) { mexPrintf("Error: More than 128 memory blocks. "); return; } //判断输入参数是否为0或1个 //为0:新分配共享内存 //为1:检索已分配的共享内存 if (nrhs > 1) { mexPrintf("UsageA: id = persis_ptr -- alloc new global memory. UsageB: persis_ptr id -- get allocated global memory information. "); return; } //内存分配 if (nrhs == 0) { mexPrintf("initializing, creating new array "); //创建持久化内存空间,这里仅分配一个实数空间 persistent_array_ptr[cnt] = mxCreateDoubleMatrix(1, 1, mxREAL); //以下函数保证了在mex调用完成后,内存空间在全局matlab内不被释放 mexMakeArrayPersistent(persistent_array_ptr[cnt]); //注册内存清理函数 mexAtExit(cleanup); //设置第cnt个内存初始化标记 initialized[cnt] = 1; //赋值 *mxGetPr(persistent_array_ptr[cnt]) = (cnt + 1)*2; cnt++; //返回内存块或句柄编号 nlhs = 1; plhs[0] = mxCreateDoubleScalar(cnt); } //检索已分配内存或句柄信息 else if (nrhs == 1) { char *val = mxArrayToString(prhs[0]); int id = atoi(val); if (id >= 1 && id <= cnt && initialized[id-1] == 1) { mexPrintf("get Information of No.%d = %f ", id, *mxGetPr(persistent_array_ptr[id-1])); } else mexPrintf("cannot get information about No.%d memory block(total %d). ", id, cnt); } }