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

标签 matlab malloc 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);
}

我在没有输入或输出的情况下调用该函数。除了初始化一些向量之外,代码实际上什么也没做。我知道代码有严重的内存泄漏,但除了内存泄漏外,当我调用该函数时,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 C calloc function, which can cause memory alignment issues leading to program termination.

虽然那只特别提到了 calloc 函数,mxMalloc documentation状态:

mxMalloc allocates contiguous heap space sufficient to hold n bytes. Use mxMalloc instead of the ANSI C malloc function to allocate memory in MATLAB applications.

因此,文档明确禁止您正在做的事情。停止这样做。别逼我过去:-)


有关更多信息,有很多关于 MatLab 使用诸如 SIMD 之类的东西进行高速数学运算的信息。

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

这很可能是导致您出现问题的原因,并且文档中的“可能导致内存对齐问题”评论支持这一点。我不是完全肯定是这种情况(因为我无法访问 MatLab 的源代码),但至少这是一个可行的解释。

关于当我使用 malloc 而不是 mxMalloc 时 MATLAB 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15102835/

相关文章:

c - 子函数内的 malloc、free 和 memmove

c - 为什么这个 C 代码中 malloc i+1 的参数是?

c - libarchive 提取文件时读取的字符过多

matlab - mex 文件输出的 int 数组

c++ - 在 matlab mex 文件中动态链接时枚举的 typeid 发生变化

matlab - 如何在 MATLAB 中检索选定的文本?

matlab - 将矩阵旋转一定角度

matlab - 为什么img(te1,te2)的尺寸比输入图像大?

c - 在 matlab 和 gsl 中使用修改后的贝塞尔函数

c++ - 如何仅复制数组的一部分以输出到 mex 文件中?