7

我有一个非常简单的程序,如下所列,它从.mat文件(来自 Matlab 的数据文件)中读取一个值并打印出来。出于某种原因,退出 main() 后出现段错误- 我可以运行gdb my_program并单步执行整个方法,但一旦完成,我在 Matlab 相关库(的依赖项)中main()输入一些方法,该方法会引发段错误.libmwfl.solibmat.so

我对 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;
}
4

1 回答 1

9

文档建议使用该函数mxDestroyArray而不是mxFree释放mxArray. 通过使用mxFree你可能会弄乱matlab的堆。从文档

不正确地销毁 mxArray

你不能mxFree用来销毁一个mxArray.

警告:您正在尝试调用mxFree数组<class-id>。的析构函数mxArraysmxDestroyArray; 请改用这个。MATLAB 将尝试修复该问题并继续,但这将导致未来版本中出现内存故障。

导致警告的示例

在下面的例子中,mxFree不销毁数组对象。此操作会释放与数组关联的结构头,但 MATLAB 仍会像需要销毁数组对象一样操作。因此 MATLAB 将尝试销毁数组对象,并在此过程中再次尝试释放其结构头。

mxArray *temp = mxCreateDoubleMatrix(1,1,mxREAL);

  ...

mxFree(temp); /* INCORRECT */

解决方案。

mxDestroyArray改为打电话。

mxDestroyArray(temp); /* CORRECT */

于 2012-08-31T12:19:33.977 回答