0

我完全是 C/MEX 的初学者。这是从 MATLAB 调用“魔术”函数的简单代码。我不知道为什么会收到“内存不足”消息。

#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;
}
4

2 回答 2

0

A_OUT似乎是R. 基本上,根据文档(在提出任何问题之前您应该阅读,只是说':)),正在创建一个新的array. 调用此函数将分配更多内存来存储此副本。

所以泄漏来自A_OUT. 你可以使用valgrind工具来帮助你找到那些,带有 options --leak-check=full。当然,使用编译器的调试标志(-g3对于gcc)进行编译,它将为您提供修复泄漏所需的大部分信息。

于 2013-08-26T13:12:36.993 回答
0

实际上,您似乎没有内存泄漏。问题似乎在于您传递给的矩阵的大小(此处mxCreateDoubleMatrix的文档)。mxCreateDoubleMatrix

A_IN在您的代码中实际上是一个 MATLAB 数组 ( const mxarray *),而不是整数,这是mxCreateDoubleMatrix需要的类型(更准确地说,它需要一个mwSize)。您的编译器可能正在将数组指针转换为整数,并将其用作大小。您可以尝试使用此代码mwGetScalar来获取 中的值A_IN,然后将其从 double 转换为 integer mwSize

...
mwSize matrixSize;
matrixSize = (mwSize) mxGetScalar(A_IN);
R = mxCreateDoubleMatrix(matrixSize, matrixSize, mxREAL);
...

但实际上,您不必R自己创造;mexCallMATLAB根据文档,当您调用时,MATLAB 会为您创建它。

最后,您应该能够R直接分配给A_OUT,而无需复制数组。

尽管您的代码按原样使用,但您不应该有任何内存泄漏,因为 MATLAB 会自动释放您在离开 MEX 函数时创建的任何矩阵,除非您另有说明。

于 2014-01-16T22:29:46.687 回答