我是C / MEX的初学者。这是一个用于从MATLAB调用“魔术”函数的简单代码。我不知道为什么我会收到“Out of memory”消息。
#include <mex.h>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
#define A_IN prhs[0]
#define A_OUT plhs[0]
mxArray *R;
R=mxCreateDoubleMatrix(A_IN,A_IN,mxREAL);
mexCallMATLAB(1, R, 1, &A_IN, "magic");
A_OUT = mxDuplicateArray(R);
mxDestroyArray(R);
return;
}
答案 0 :(得分:0)
A_OUT
似乎与R
重复。基本上,根据doc(您在询问任何问题之前应该阅读,只是说':) :),正在创建一个新的array
。调用此函数将分配更多内存来存储此副本。
所以泄漏来自A_OUT
。您可以使用 valgrind 工具通过选项--leak-check=full
帮助您找到这些工具。当然,使用编译器的调试标志进行编译( gcc 的-g3
),它将为您提供修复泄漏所需的大部分信息。
答案 1 :(得分:0)
实际上,您似乎没有内存泄漏。
问题似乎在于您传递给mxCreateDoubleMatrix
的矩阵的大小(mxCreateDoubleMatrix
here上的文档)。
A_IN
实际上是一个MATLAB数组(const mxarray *
),而不是一个整数,它是mxCreateDoubleMatrix
所需的类型(更准确地说,它需要一个mwSize
)。您的编译器可能将数组指针转换为整数,并将其用作大小。您可以尝试使用此代码,使用mwGetScalar
获取A_IN
中的值,然后将其从double转换为整数mwSize
:
...
mwSize matrixSize;
matrixSize = (mwSize) mxGetScalar(A_IN);
R = mxCreateDoubleMatrix(matrixSize, matrixSize, mxREAL);
...
但实际上,您不必自己创建R
;根据{{3}}。
mexCallMATLAB
时,MATLAB将为您创建。{/ p>
最后,您应该可以直接将R
分配给A_OUT
,而无需复制数组。
你的代码不应该有任何内存泄漏,因为MATLAB documentation你离开MEX函数时创建的任何矩阵,除非你另有说明。