gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 09:24:14 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com