我有一个非常简单的程序,如下所示,它从.mat
文件(来自Matlab的数据文件)读取值并打印出来。出于某种原因,我在退出main()后出现了段错误 - 我可以运行gdb my_program
并逐步完成整个方法,但只要main()
完成,我就进入Matlab相关库中的一些方法(libmwfl.so
,libmat.so
的依赖项),它会引发段错误。
我对C编程完全陌生,但是有些人在阅读时我怀疑我要么corrupting the stack或calling some destructor twice。但是,我在代码中看不到任何内容 - 正如我所说的,我可以毫无问题地使用调试器来完成我的代码。
我在这里做错了什么?
#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;
}
答案 0 :(得分:9)
文档建议使用函数mxDestroyArray
代替mxFree
来释放mxArray
。使用mxFree
你可能搞砸了matlab的堆。来自documentation
不正确地销毁mxArray
您无法使用
mxFree
来销毁mxArray
。警告:您正尝试在
mxFree
阵列上拨打<class-id>
。mxArrays
的析构函数为mxDestroyArray
;请打电话 相反。 MATLAB将尝试解决问题并继续, 但这会在将来的版本中导致内存故障。导致警告的示例
在以下示例中,
mxFree
不会销毁数组对象。 此操作释放与数组关联的结构头, 但是MATLAB仍然会像数组对象一样运行 销毁。因此MATLAB将尝试销毁数组对象,并在 该过程,再次尝试释放其结构标题。<强>
mxArray *temp = mxCreateDoubleMatrix(1,1,mxREAL);
强>...
<强>
mxFree(temp); /* INCORRECT */
强><强>解。强>
请改为
mxDestroyArray
。<强>
mxDestroyArray(temp); /* CORRECT */
强>