gpt4 book ai didi

matlab - mex 函数内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-03 20:29:53 25 4
gpt4 key购买 nike

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

N

最佳答案

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

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

关于matlab - mex 函数内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22713511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com