Matlab mex函数内存泄漏

Matlab mex函数内存泄漏,matlab,memory-leaks,mex,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*

我刚开始编写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;
void-mexFunction(int-nlhs,mxArray*plhs[],int-nrhs,const-mxArray*prhs[]){
双精度*ecg;/*指向双精度输入数据的指针*/
double*outArray;/*指向输出数据的double的指针*/
void*dyn;/*指向动态内存分配的void的指针
int N=0;
int i=1;
int j=0;
int k=0;
/*检查参数的数目是否正确*/
如果(nrhs!=1)mexErrMsgIdAndTxt(“EplimitedQRSDetector:NoInput”,“此函数接受一个输入参数:ECG”);
如果(nlhs!=1)mexErrMsgIdAndTxt(“EplimitedQRSDetector:NoOutput”,“此函数需要一个输出参数”);
/*加载输入数据并分配输出内存*/
ecg=mxGetPr(prhs[0]);/*输入数据加载*/
N=(int)mxGetM(prhs[0]);
plhs[0]=mxCreateDoubleMatrix(0,0,mxREAL);
dyn=mxCalloc(N,sizeof(double));/*动态内存分配*/
outArray=(双*)dyn;
/*调用子例程*/

对于(j=0;j,在代码中,您不应在分配的内存上调用mxFree。这需要返回到MATLAB,因为这是输出。您还在同一指针上调用它两次。mxSetData不会复制您的数据。它会设置指针


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

由于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)

该算法开始正常工作。感谢您的帮助。

您好,谢谢;您说得对,我随机添加了mxFree以解决问题。在mxSetM中,我忽略最后一个值,因为“k”在计算例程调用结束时递增,所以“OutArray”的第k个元素实际上是最后一个值o之后的元素f感兴趣。即使在删除mxFree后,函数也会以相同的错误停止。输入的典型大小或N的值是多少?这取决于应用程序,它可以是10^3到10^6。我看不出代码有任何错误。如果使用mxGetPr重置它,则确实需要mxFree现有内存。这应该很小,因为它是0x0。您也可以先创建本地副本,然后创建大小正确的mxArray并将数据复制到该阵列,而不是设置指针和使用mxCalloc。