Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ mexFunction中的内存管理问题_C++_Matlab - Fatal编程技术网

C++ mexFunction中的内存管理问题

C++ mexFunction中的内存管理问题,c++,matlab,C++,Matlab,我正在读取一个二进制数据文件,该文件是通过调用Matlab m-file中的以下行编写的: disp(sprintf('template = %d', fwrite(fid, template_1d, 'uint8'))); disp(sprintf('template=%d',fwrite(fid,template_1d,'uint8')); AFAIK,uint8与BYTE、unsigned char和unsigned short类型的大小相同。因此,我在MeXType实例化的C++类中的文

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

disp(sprintf('template = %d', fwrite(fid, template_1d, 'uint8'))); disp(sprintf('template=%d',fwrite(fid,template_1d,'uint8')); AFAIK,uint8与BYTE、unsigned char和unsigned short类型的大小相同。因此,我在MeXType实例化的C++类中的文件读取方法中编写了以下代码: template1D = (unsigned short*) malloc(Nimgs*sizeof(unsigned short)); printf("template1D = %d\n", fread(template1D, sizeof(unsigned short), Nimgs, dfile)); template1D=(无符号短*)malloc(Nimgs*sizeof(无符号短)); printf(“template1D=%d\n”,fread(template1D,sizeof(unsigned short),Nimgs,dfile)); 下面是我如何在类析构函数的helper函数中释放这个成员变量的:

free((void*) template1D); 自由((空*)模板1d); 在主mex函数中,当我没有通过调用mexmakeMemoryPersist()函数实例化类对象以在mex函数完成后保留在内存中时,template1D会被正确清除,而不会从Matlab发出分段错误消息。但是,如果我确实实例化了类以在内存中持久化,如下所示:

if (!dasani) { dasani = new NeedleUSsim; mexMakeMemoryPersistent((void*) dasani); mexAtExit(ExitFcn); } 如果(!dasani) { dasani=新的NeedleUSsim; mexmakemorypersistent((void*)dasani); MEXATEXT(ExitFcn); } ExitFcn为:

void ExitFcn() { delete dasani; } void ExitFcn() { 删除达萨尼; } 然后当我在自由((void*)template1D);,Matlab给了我一条关于分段错误的错误消息。我已经检查了内存大小,它们似乎是一致的。对于MalC/CaloC/Fielt函数,当我执行C++项目时,使用Matlab的MxMalOc/MxCalLoC/MxFipe函数。 根据这一描述,您对我有什么进一步的建议来解决这个问题并确保将来不会发生这种情况(或者至少知道如何在将来处理类似的问题)

提前谢谢

----------------------------添加物------------------------------------------------------

下面的代码块基本上显示了我的mex文件的JIST。mex文件基本上是一个可执行文件,它在Matlab中运行,并由带有一些Matlab头的C/C++代码编译而成

void ExitFcn() { delete dasani; } void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { needle_info pin; // check number of i/o if they are correct if (nrhs != NUMIN) { mexErrMsgTxt("Invalid number of input arguments"); } else if (nlhs != NUMOUT) { mexErrMsgTxt("Invalid number of output arguments"); } // check if the input is noncomplex if (mxIsComplex(NEEDLE)) { mexErrMsgTxt("Input must be a noncomplex scalar integer."); } // check if the dimensions of the needle information is valid int needlerows, needlecols; needlerows = mxGetM(NEEDLE); needlecols = mxGetN(NEEDLE); void ExitFcn() { 删除达萨尼; } void MEX函数(int nlhs、mxArray*plhs[]、int nrhs、const mxArray*prhs[]) { 针信息针; //检查i/o数量是否正确 如果(nrhs!=NUMIN) { mexErrMsgTxt(“输入参数的数量无效”); } 否则如果(nlhs!=NUMOUT) { mexErrMsgTxt(“输出参数的数量无效”); } //检查输入是否为非复合输入 if(mxicomplex(针)) { MEXERMSGSTXT(“输入必须是非复合标量整数”); } //检查打捆针信息的尺寸是否有效 针线,针线; 针行=mxGetM(针); 针线=mxGetN(针);
if(针线<1 | |针线<6)
{ MEXERMSGSTXT(“针信息的尺寸无效”); } 浮动*针尖,*yPoint; //检索当前针信息 //变量的顺序始终如下所示: //r,θ,l,ρ,α,β 针尖=(浮点*)mxGetData(指针); 针r=针尖[0]; 针θ=针尖[1]; 针l=针尖[2]; pin.rho=针尖[3]; pin.alpha=针尖[4]; pin.beta=针尖[5]; ////读取文件输入 **//如果(!dasani) //{ //dasani=新的NeedleUSsim; //mexmakemorypersistent((void*)dasani); //MEXATEXT(ExitFcn); //} dasani=新的NeedleUSsim; 删除达萨尼** //现在发送一个无用的输出(如果概念上不需要的话,就把它去掉) plhs[0]=mxCreateNumericMatrix(1,1,mxSINGLE_类,mxREAL); yPoint=(float*)mxGetData(plhs[0]); *yPoint=1; }
如果用户在命令行或m文件脚本的任何位置调用“mexfunction”,则此代码将在生成/编译后运行是我正在看的问题。从第二个片段来看,我可能在DMataNosil中分配内存,与Matlab内存不同(因为内存的范围仅限于C++ MeX函数,还有另一个内存空间,可以看到MATLAB程序的范围)。。否则,我不知道为什么Matlab会抱怨这个问题。

感觉像是mexmakemorypersistent()这导致了所有这些麻烦。我想你必须用它来指示matlab在完成后不要删除内存。但是为什么matlab要删除dasani指针?该指针是如何提供给matlab的?matlab需要它做什么?

感觉它是MexMakeMemoryPersist()这导致了所有这些麻烦。我想你必须用它来指示matlab在完成后不要删除内存。但是为什么matlab要删除dasani指针?该指针是如何提供给matlab的?matlab需要它做什么?

在使dasani成为持久指针的基础上,我还需要使其成员变元mxMalloc/mxCalloc分配的内存也是持久性的,例如:

if (!dasani) { dasani = new 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); } 如果(!dasani) { dasani=新的NeedleUSsim; MexMakeMemoryPersist((void*)dasani->tplL); mexmakemorypersistent((void*)dasani->tplR); mexmakemorypersistent((void*)dasani->tplRho_deg); mexMakeMemoryPersistent((void*)dasani->tplAlpha_deg); mexMakeMemoryPersistent((void*)dasani->tplBeta_deg); mexmakemorypersistent((void*)dasani->hashTb); mexmakemorypersistent((void*)dasani->template1D); MEXATEXT(ExitFcn); } 使用析构函数,如图所示:

void 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); } void-NeedleUSsim::Deallocate() { 自由((无效*)tplR;自由((无效*)tplL); 游离((空隙*)tplRho_度);游离((空隙*)tplAlpha_度); 游离((空隙*)tplBeta_deg); 自由((void*)hashTb); 自由((空*)模板1d); }
在使dasani成为持久指针的基础上,我还需要使用mem生成其成员变量 if (!dasani) { dasani = new 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); } void 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); }
dasani = new NeedleUSsim;
mexMakeMemoryPersistent((void*) dasani);