为什么我在C / MEX中有内存泄漏?

时间:2013-08-26 12:48:16

标签: c memory mex

我是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;
}

2 个答案:

答案 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函数时创建的任何矩阵,除非你另有说明。