【问题标题】:mex function memory leakmex函数内存泄漏
【发布时间】:2014-03-28 12:56:19
【问题描述】:

我是编写 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 函数时,我收到错误消息“超出了函数允许的最大变量大小”。由于该功能在我使用它的前几次运行良好,我认为问题在于我没有在我的代码中以正确的方式释放内存。任何建议将不胜感激:) 谢谢!

没有

【问题讨论】:

    标签: matlab memory-leaks mex


    【解决方案1】:

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

    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)
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 您好,谢谢;你是对的,我非常随机地添加了 mxFree,试图解决这个问题。在 mxSetM 中,我忽略了最后一个值,因为“k”在计算例程调用结束时递增,因此“OutArray”的第 k 个元素实际上是最后一个感兴趣的值之后的元素。即使在删除 mxFree 后,该函数也会停止并出现相同的错误。
      • 输入的典型大小或 N 的值是多少?
      • 这真的取决于应用程序,它可以是 10^3 到 10^6
      • 我看不出代码有什么问题。如果您使用 mxGetPr 重置它,您确实需要 mxFree 现有内存。这应该很小,因为它是 0x0。
      • 您也可以先创建一个本地副本,然后创建具有正确大小的 mxArray 并将数据复制到该位置,而不是设置指针和使用 mxCalloc。
      猜你喜欢
      • 1970-01-01
      • 2013-02-07
      • 2018-03-03
      • 1970-01-01
      • 2020-09-11
      • 2012-09-16
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      相关资源
      最近更新 更多