我在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);
}
Run Code Online (Sandbox Code Playgroud)
我在没有输入或输出的情况下调用该函数.除了初始化一些向量之外,代码什么也没做.我知道代码有严重的内存泄漏,但除了内存泄漏,当我调用该函数时,MATLAB关闭.
如果我替换malloc为mxMalloc,代码将执行没有问题.我知道使用mx*来分配内存是可取的,但我确信malloc和calloc以及free都可以在MEX中使用而没有任何问题.
我也删除了(double*),但它仍然崩溃了.
如果让我知道为什么提到的代码导致MATLAB崩溃,我们将不胜感激.谢谢
首先,不要转换返回值malloc(在C中无论如何,C++是另一回事),特别是如果你不包括stdlib.h - 你会在你的整数和环境中遇到各种各样的问题指针是不同的大小.
脱掉演员,看看它是否抱怨指定int一个double *.
如果是,请确保包含stdlib.h以获取malloc原型.
在任何情况下,文档都很清楚:
数组必须在动态内存中; 打电话
mxCalloc来分配这个记忆.不要使用ANSI Ccalloc函数,这会导致内存对齐问题导致程序终止.
虽然这只是提到calloc功能,但mxMalloc文档说明:
mxMalloc分配足以容纳n字节的连续堆空间.使用mxMalloc而不是ANSI Cmalloc函数在MATLAB应用程序中分配内存.
因此,文档明确禁止您正在做的事情.停止这样做.不要让我过来那里:-)
有关详细信息,MatLab使用SIMD等高速数学运算的信息还有很多.
SIMD可能需要比常规C数据类型所需的更严格的对齐(因此比malloc保证更严格).
这可能是造成您的问题的原因,并且受文档中"可能导致内存对齐问题"注释的支持.我不完全确定是这种情况(因为我无法访问MatLab的源代码),但它至少是一个可行的解释.