当我使用malloc而不是mxMalloc时,MATLAB崩溃

Pou*_*uya 2 malloc matlab mex

我在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关闭.

如果我替换mallocmxMalloc,代码将执行没有问题.我知道使用mx*来分配内存是可取的,但我确信malloc和calloc以及free都可以在MEX中使用而没有任何问题.

我也删除了(double*),但它仍然崩溃了.

如果让我知道为什么提到的代码导致MATLAB崩溃,我们将不胜感激.谢谢

pax*_*blo 5

首先,不要转换返回值malloc(在C中无论如何,C++是另一回事),特别是如果你不包括stdlib.h - 你会在你的整数和环境中遇到各种各样的问题指针是不同的大小.

脱掉演员,看看它是否抱怨指定int一个double *.

如果是,请确保包含stdlib.h以获取malloc原型.


在任何情况下,文档都很清楚:

数组必须在动态内存中; 打电话mxCalloc来分配这个记忆.不要使用ANSI C calloc函数,这会导致内存对齐问题导致程序终止.

虽然这只是提到calloc功能,但mxMalloc文档说明:

mxMalloc分配足以容纳n字节的连续堆空间.使用mxMalloc而不是ANSI C malloc函数在MATLAB应用程序中分配内存.

因此,文档明确禁止您正在做的事情.停止这样做.不要让我过来那里:-)


有关详细信息,MatLab使用SIMD等高速数学运算的信息还有很多.

SIMD可能需要比常规C数据类型所需的更严格的对齐(因此比malloc保证更严格).

这可能是造成您的问题的原因,并且受文档中"可能导致内存对齐问题"注释的支持.我不完全确定是这种情况(因为我无法访问MatLab的源代码),但它至少是一个可行的解释.