mex函数内存泄漏

时间:2014-03-28 12:56:19

标签: matlab memory-leaks mex

我是编写MEX函数的新手,我遇到了内存问题。 MEXf度假程序如下:

void mexFunction (int nlhs, mxArray *plhs[], int nrhs,const mxArray *prhs[]){

double *ecg;                    /*Pointer to double for input data*/
double *outArray;               /*Pointer to double for output data*/
void *dyn;                      /*Pointer to void for the dynamic allocation of memory 
int N=0;
int i=1;
int j=0; 
int k=0;
/*CHECK FOR PROPER NUMBER OF ARGUMENTS*/

if (nrhs != 1 ) mexErrMsgIdAndTxt("EplimitedQRSDetector:NoInput", "This function takes  one input argument: ECG.");
else if(nlhs!=1) mexErrMsgIdAndTxt("EplimitedQRSDetector:NoOutput", "This function requires one output argument.");



/*LOAD INPUT DATA AND ALLOCATE OUTPUT MEMORY*/
ecg=mxGetPr(prhs[0]);                       /*Input data loading*/
N=(int) mxGetM(prhs[0]);                    
plhs[0]=mxCreateDoubleMatrix(0,0,mxREAL); 
dyn = mxCalloc(N,sizeof(double));           /*Dynamic memory allocation*/
outArray=(double*) dyn;                     



/*CALL THE SUBROUTINE*/

for (j=0;j<N;j++){
    outArray[k]=QRSDet(ecg[j], i );         
    if (outArray[k]!=0){ 
        outArray[k]=j-outArray[k];         
        k++;
    }
    i=0;
}


/*FILL THE OUTPUT ARRAY*/

mxSetData(plhs[0], outArray);               
mxSetM(plhs[0], k-1);                       
mxSetN(plhs[0], 1);
mxFree(dyn);
mxFree(outArray);
return;

当我从matlab命令窗口调用Mex函数时,我收到错误消息“超出函数允许的最大变量大小”。由于该功能在我使用它的前几次运行良好,我认为问题是我没有在我的代码中以正确的方式释放内存。任何建议将不胜感激:)谢谢!

<磷>氮

2 个答案:

答案 0 :(得分:2)

由于Navan建议的修改,代码现在正在运行。除了不正确使用mxFree之外,这三行还会导致分段违规:

mxSetData(plhs[0], outArray);               
mxSetM(plhs[0], k-1);                       
mxSetN(plhs[0], 1);

outArray指向使用mxCalloc分配的Nx1数组,因此将plhs [0]的第一个维度设置为(k-1)!= N会导致分段违规。一旦用

替换该行
mxSetM(plhs[0], N)

算法开始正常工作。谢谢你的帮助。

答案 1 :(得分:1)

在您的代码中,您不应该在分配的内存上调用mxFree。这需要返回MATLAB,因为那是输出。你也在同一个指针上调用它两次。 mxSetData不会复制您的数据。它设置指针。

我认为在调用mxSetM时你需要传递k而不是k-1,除非你故意忽略了最后一个值。