c语言 - 显然我正在损坏堆栈 - 但是如何?



我有一个非常简单的程序,如下所示,它从.mat文件(来自Matlab的数据文件)中读取一个值并打印它。由于某种原因,我在退出main()后得到了一个segfault错误-我可以运行gdb my_program并逐步完成整个方法,但一旦main()完成,我在一个与Matlab相关的库(libmwfl.solibmat.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>数组上调用mxFreemxArrays的析构函数是mxDestroyArray;请打电话相反。MATLAB将尝试解决该问题并继续,但这将导致未来版本中的内存故障。

引起警告的示例

在以下示例中,mxFree不会破坏数组对象。此操作释放与数组相关联的结构标头,但是MATLAB仍然会像数组对象需要被摧毁。因此,MATLAB将试图破坏数组对象,并在进程,尝试再次释放其结构标头。

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

  ...

mxFree(temp); /* INCORRECT */

解决方案

请改为调用mxDestroyArray

mxDestroyArray(temp); /* CORRECT */

最新更新