显然我正在破坏堆栈 - 但是怎么样?

时间:2012-08-31 12:05:25

标签: c matlab segmentation-fault

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

我对C编程完全陌生,但是有些人在阅读时我怀疑我要么corrupting the stackcalling 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;
}

1 个答案:

答案 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 */