我有一个非常简单的程序,如下所示,它从.mat
文件(来自Matlab的数据文件)中读取一个值并打印它。由于某种原因,我在退出main()后得到了一个segfault错误-我可以运行gdb my_program
并逐步完成整个方法,但一旦main()
完成,我在一个与Matlab相关的库(libmwfl.so
,libmat.so
的依赖项)中输入了一些方法,它抛出了一个segfault。
我对C编程完全陌生,但读到一些东西后,我怀疑我要么以某种方式破坏了堆栈,要么两次调用了某个析构函数。然而,我在代码中看不到任何这些——正如我所说,我可以使用调试器顺利地执行代码。
我在这里做错了什么?
#include <stdlib.h>
#include <stdio.h>
#include <mat.h>
int main(int argc, char *argv[]) {
double value;
MATFile *datafile;
datafile = matOpen("test.mat", "r");
mxArray *mxv;
mxv = matGetVariable(datafile, "value");
value = *mxGetPr(mxv);
mxFree(mxv);
matClose(datafile);
printf("The value fetched from the .mat file was: %f", value);
return 0;
}
文档建议使用函数mxDestroyArray
而不是mxFree
来释放mxArray
。使用mxFree
可能会把matlab的堆搞砸。从文件
错误地销毁mxArray
您不能使用
mxFree
销毁mxArray
。警告:您正试图在
<class-id>
数组上调用mxFree
。mxArrays
的析构函数是mxDestroyArray
;请打电话相反。MATLAB将尝试解决该问题并继续,但这将导致未来版本中的内存故障。引起警告的示例
在以下示例中,
mxFree
不会破坏数组对象。此操作释放与数组相关联的结构标头,但是MATLAB仍然会像数组对象需要被摧毁。因此,MATLAB将试图破坏数组对象,并在进程,尝试再次释放其结构标头。
mxArray *temp = mxCreateDoubleMatrix(1,1,mxREAL);
...
mxFree(temp); /* INCORRECT */
解决方案
请改为调用
mxDestroyArray
。
mxDestroyArray(temp); /* CORRECT */