【问题标题】:Apparently I'm corrupting the stack - but how?显然我正在破坏堆栈 - 但是如何?
【发布时间】:2012-08-31 12:05:25
【问题描述】:

我有一个非常简单的程序,如下所列,它从.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;
}

【问题讨论】:

  • 如果我站在你的立场上,我会检查数据文件是否为 NULL(这意味着文件无法打开)。
  • @GeorgeStamatiou 看了程序,一时间,连我自己也有同感。但如果是这种情况,程序将(很可能)在main 内崩溃,因为 NULL 指针取消引用,而不是在退出 main 之后,如 OP 所示。 Giuseppe Guerrini 的回答发现了确切的问题

标签: c matlab segmentation-fault


【解决方案1】:

文档建议使用函数mxDestroyArray 而不是mxFree 来释放mxArray。通过使用mxFree,您可能会弄乱matlab 的堆。来自documentation

不正确地销毁 mxArray

您不能使用 mxFree 来销毁 mxArray

警告:您正试图在 &lt;class-id&gt; 数组上调用 mxFreemxArrays 的析构函数是 mxDestroyArray;请打电话 这个代替。 MATLAB 将尝试解决问题并继续, 但这会在未来的版本中导致内存故障。

导致警告的示例

在以下示例中,mxFree 不会破坏数组对象。 此操作释放与数组关联的结构头, 但 MATLAB 仍会像数组对象一样运行 被摧毁。因此 MATLAB 将尝试销毁数组对象,并在 进程,再次尝试释放其结构头。

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

  ...

mxFree(temp); /* INCORRECT */

解决方案。

请致电 mxDestroyArray

mxDestroyArray(temp); /* CORRECT */

【讨论】:

  • 这非常有效 - 非常感谢!但是,我还没有看到文档的那部分。你愿意提供一个链接吗? (那里可能有更多我可以用来知道的事情......;))
  • @TomasLycken 给你。 Documentation
猜你喜欢
  • 2011-01-06
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 2017-09-04
  • 2011-04-21
  • 2011-11-01
  • 1970-01-01
相关资源
最近更新 更多