我在 MATLAB 中编写了以下代码:
#include <string.h>
#include <stdlib.h>
#include "mex.h"
#include "matrix.h"
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[]){
double* x = (double*)malloc(5 * sizeof(*x));
int k;
for(k=0;k<5;k++)
x[k] = k;
mxArray* p1 = mxCreateDoubleMatrix(5, 1, mxREAL);
mxSetPr(p1, x);
}
我在没有输入或输出的情况下调用该函数。除了初始化一些向量之外,代码实际上什么也没做。我知道代码有严重的内存泄漏,但除了内存泄漏外,当我调用该函数时,MATLAB 关闭。
如果我将 malloc
替换为 mxMalloc
,代码将毫无问题地执行。
我知道使用 mx* 分配内存更可取,但我确信 malloc 和 calloc 以及 free 可以在 MEX 中毫无问题地使用。
我也删除了 (double*),但它仍然崩溃。
如果让我知道上述代码导致 MATLAB 崩溃的原因,我们将不胜感激。 谢谢
最佳答案
首先,不要转换 malloc
的返回值(无论如何在 C 中,C++ 是另一回事),尤其是如果您不包括 stdlib.h - 您将在整数和指针大小不同的环境中遇到各种问题。
取消转换,看看它是否提示将 int
分配给 double *
。
如果是,请确保包含 stdlib.h
以获取 malloc
原型(prototype)。
无论如何,documentation很清楚:
The array must be in dynamic memory; call
mxCalloc
to allocate this memory. Do not use the ANSI Ccalloc
function, which can cause memory alignment issues leading to program termination.
虽然那只特别提到了 calloc
函数,mxMalloc
documentation状态:
mxMalloc
allocates contiguous heap space sufficient to holdn
bytes. UsemxMalloc
instead of the ANSI Cmalloc
function to allocate memory in MATLAB applications.
因此,文档明确禁止您正在做的事情。停止这样做。别逼我过去:-)
有关更多信息,有很多关于 MatLab 使用诸如 SIMD 之类的东西进行高速数学运算的信息。
SIMD 可能需要比常规 C 数据类型要求更严格的对齐(因此比 malloc
保证的更严格)。
这很可能是导致您出现问题的原因,并且文档中的“可能导致内存对齐问题”评论支持这一点。我不是完全肯定是这种情况(因为我无法访问 MatLab 的源代码),但至少这是一个可行的解释。
关于当我使用 malloc 而不是 mxMalloc 时 MATLAB 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15102835/