Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
 
 
主题工具 显示模式
旧 2019-12-10, 16:49   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 mexFunction中的内存管理问题

我正在读取二进制数据文件,该文件是通过在Matlab m文件中调用以下行编写的:

disp(sprintf('template =%d',fwrite(fid,template_1d,'uint8')))); AFAIK,uint8的大小与BYTE,unsigned char和unsigned short类型相同。因此,我在用Matlab调用的mex函数实例化的C ++类中的文件读取方法中编写了以下代码:

template1D =(unsigned short *)malloc(Nimgs * sizeof(unsigned short));printf(“ template1D =%d \ n”,fread(template1D,sizeof(unsigned short),Nimgs,dfile));以下是我如何在类析构函数的辅助函数中重新分配此成员变量的方法:

free((void *)template1D);在主要的mexfunction中,当我没有通过调用mexMakeMemoryPersistent()函数在mex函数完成后实例化类对象以保留在内存中时,template1D会正确清除,而不会出现Matlab的分段错误消息。但是,如果确实实例化该类以将其持久化,如下所示:

如果(!dasani){ dasani =新的NeedleUSsim; mexMakeMemoryPersistent((void *)dasani); mexAtExit(ExitFcn);} ExitFcn是:

void ExitFcn(){ 删除dasani;}然后当我在free((void *)template1D);的行上时,Matlab给我一条有关分段错误的错误消息。我检查了内存大小,它们似乎是一致的。对于malloc / calloc / free函数,在将C ++项目作为Matlab mex函数执行时,我正在使用Matlab的mxMalloc / mxCalloc / mxFree函数。

根据此描述,您对我有什么进一步的建议来解决此问题并确保将来不再发生(或至少知道将来如何处理类似的问题)?

提前致谢。

----------------------------添加--------------------- ---------------------------------

以下代码块基本上显示了我的mex文件的原理。 mex文件基本上是一个可执行文件,可在Matlab中运行,并通过带有某些Matlab标头的C / C ++代码进行编译。

void ExitFcn(){ 删除dasani;}void mexFunction(int nlhs,mxArray * plhs [],int nrhs,const mxArray * prhs []){ needle_info引脚; //检查I / O的数量是否正确 如果(nrhs!= NUMIN) { mexErrMsgTxt(“无效的输入参数数量”); } 否则,如果(nlhs!= NUMOUT) { mexErrMsgTxt(“无效的输出参数数量”); } //检查输入是否为非复杂 如果(mxIsComplex(NEEDLE)) { mexErrMsgTxt(“输入必须是非复杂的标量整数。”) } //检查机针信息的尺寸是否有效 int针叶,neecols; 针数= mxGetM(NEEDLE); 针叶= mxGetN(NEEDLE); if (needlerows < 1 || needlecols < 6) { mexErrMsgTxt(“针信息的尺寸无效”); } 浮动* needlePoint,* yPoint; //检索当前的机针信息 //变量的顺序始终如下: // r,theta,l,rho,alpha,beta needlePoint =(float *)mxGetData(NEEDLE); pin.r = needlePoint [0]; pin.theta = needlePoint [1]; pin.l = needlePoint [2]; pin.rho = needlePoint [3]; pin.alpha = needlePoint [4]; pin.beta = needlePoint [5]; ////读取文件输入 ** //如果(!dasani) // { // dasani = new NeedleUSsim; // mexMakeMemoryPersistent((void *)dasani); // mexAtExit(ExitFcn); //} dasani =新的NeedleUSsim; 删除dasani; ** //现在发送无用的输出(如果在概念上不需要,请消除此输出 plhs [0] = mxCreateNumericMatrix(1,1,mxSINGLE_CLASS,mxREAL); yPoint =(float *)mxGetData(plhs [0]); * yPoint = 1;} 如果用户从命令行或m文件脚本的任何位置调用“ mexfunction”,则此代码将在构建/编译后运行。我正在查看的问题是用“ **”括起来的代码段(当我尝试加粗该代码段时)。从第二个片段来看,我可能正在为dasani指针分配一个与Matlab内存不同的内存(因为该内存的作用域仅限于C ++ mex函数,而另一个内存空间的作用域仅对C ++ mex函数有效)。 Matlab程序)。否则,我不确定Matlab为什么抱怨这个问题。


回答:
除了使dasani成为持久性指针外,我还需要使它的成员变量与mxMalloc / mxCalloc分配的内存也具有持久性,例如:

如果(!dasani){ dasani =新的NeedleUSsim; mexMakeMemoryPersistent((void *)dasani-> tplL); mexMakeMemoryPersistent((void *)dasani-> tplR); mexMakeMemoryPersistent((void *)dasani-> tplRho_deg); mexMakeMemoryPersistent((void *)dasani-> tplAlpha_deg); mexMakeMemoryPersistent((void *)dasani-> tplBeta_deg); mexMakeMemoryPersistent((void *)dasani-> hashTb); mexMakeMemoryPersistent((void *)dasani-> template1D); mexAtExit(ExitFcn);}用析构函数如下所示:

无效NeedleUSsim :: Deallocate(){ free((void *)tplR); free((void *)tplL); free((void *)tplRho_deg); free((void *)tplAlpha_deg); free((void *)tplBeta_deg); free((void *)hashTb); free((void *)template1D);}

更多&回答...
poster 当前离线   回复时引用此帖
 

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 03:21


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.