gpt4 book ai didi

matlab - 对从 Matlab 编译器运行时返回的 mxArray 对象调用 mxDestroyArray

转载 作者:太空宇宙 更新时间:2023-11-03 19:36:59 25 4
gpt4 key购买 nike

我们一直在与从 Matlab 编译器创建的库进行交互。我们的问题与从库返回的数组有关。

一旦我们完成数组,我们想释放内存,但是,这样做偶尔会导致段错误。

这是 Matlab 库 (bugtest.m)::

function x = bugtest(y)

x = y.^2;

这是我们用来构建它的命令(创建 libbugtest.solibbugtest.h):

mcc -v -W lib:libbugtest -T link:lib bugtest.m

这是我们的 C 测试程序 (bug_destroyarray.c)::

#include <stdio.h>
#include <stdlib.h>

#include "mclmcrrt.h"
#include "libbugtest.h"

#define TESTS 15000

int main(int argc, char **argv)
{
const char *opts[] = {"-nojvm", "-singleCompThread"};
mclInitializeApplication(opts, 2);
libbugtestInitialize();

mxArray *output;
mxArray *input;
double *data;
bool result;
int count;

for (count = 0; count < TESTS; count++) {

input = mxCreateDoubleMatrix(4, 1, mxREAL);
data = mxGetPr(input); data[0] = 0.5; data[1] = 0.2; data[2] = 0.2; data[3] = 0.1;

output = NULL;
result = mlfBugtest(1, &output, input);
if (result) {
/* HERE IS THE PROBLEMATIC LINE */
/*mxDestroyArray(output);*/
}

mxDestroyArray(input);
}

libbugtestTerminate();
mclTerminateApplication();
}

下面是我们如何编译 C 程序(创建 bug_destroyarray)::

mbuild -v bug_destroyarray.c libbugtest.so

我们认为 mxDestroyArray(output) 是有问题的。

我们运行以下命令来测试崩溃:

  • 在 32 个集群节点中的每一个上。
  • 运行 bug_destroyarray
  • 监控段错误的输出。

大约 10% 的时间会发生崩溃。如果这是跨节点独立的那么您可能会认为它大约有 0.3% 的时间崩溃。

当我们删除那条有问题的行时,我们无法使其崩溃。

但是,当不包括该行时,内存使用量会逐渐增加。

根据我们所做的研究,我们似乎应该销毁返回的数组,如果不销毁,我们如何阻止内存泄漏?

谢谢。

最佳答案

好吧,我知道这现在有点老了,但万一它有助于为任何路过的人澄清事情......

Amro 提供了最相关的信息,但要扩展它,如果您不按现状调用 mxDestroyArray 函数,那么您将泄漏内存,因为您已将输出设置为 NULL 因此 mlf 函数不会尝试调用 mxDestroyArray。这样做的必然结果是,如果您调用了 mxDestroyArray 然后尝试调用 mlf 函数并且 output 不是 NULL,那么 mlf 函数将尝试调用 mxDestroyArrayoutput 上。那么问题是 output 指向什么?在将 output 传递给 mxDestroyArray 之后,它会发生什么情况有点阴暗。我会说这是一个没有根据的假设,它被设置为 NULLmxDestroyArray 将其参数设置为 NULL 肯定没有记录在案。因此,我怀疑发生的事情是,在您调用 mxDestroyArray 和重新执行 mlf 函数的代码之间,已经为 output 指向的内存分配了其他内容所以你的 mlf 函数试图释放属于其他东西的内存。瞧,段错误。当然,只有在重新分配该内存时才会发生这种情况。有时您会很幸运,有时则不然。

黄金法则是,如果您自己调用 mxDestroyArray 来获取将要重复使用的内容,请在之后立即将指针设置为 NULL。无论如何,您只需要真正销毁函数末尾的内容,因为您可以在 mlf 调用中安全地重用输出变量。

家伙

关于matlab - 对从 Matlab 编译器运行时返回的 mxArray 对象调用 mxDestroyArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16784734/

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