回到我们一直在与接口从MATLAB编译器创建一个图书馆。我们的问题与库中返回的数组有关。上mxArray调用mxDestroyArray对象从MATLAB编译器运行时
一旦我们与阵列完成,我们想释放内存,但是,这样做会导致偶尔的段故障。
这里是Matlab的库(bugtest.m
)::
下面是我们用来构建它的命令(创建libbugtest.so
和libbugtest.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%的时间内崩溃。
当我们采取的是有问题的行,我们是无法导致崩溃。当不包括该行
然而内存使用情况逐渐增加。
从我们所做的研究看来,我们似乎是而不是应该销毁返回的数组,如果不是,我们如何阻止泄漏内存?
谢谢。
你确定你有'mlfBugtest'的签名是否正确吗?该文档似乎表明'mlf'函数返回'void',而不是'bool'。 – wakjah