7

以下に示す非常に単純なプログラムがあります。このプログラムは、.matファイル(Matlabのデータファイル)から値を読み取り、それを出力します。何らかの理由で、 main()を終了した後にsegfaultエラーが発生します-メソッド全体を実行gdb my_programしてステップスルーできますが、終了するとすぐに、Segfaultをスローするmain()Matlab関連ライブラリ(libmwfl.soの依存関係)にメソッドを入力しますlibmat.so

私はCプログラミングにまったく慣れていませんが、読んでいると、スタックが破損しているか、デストラクタを2回呼び出しているのではないかと思われます。ただし、コードにそれらのいずれも表示されません。前述のように、デバッガーを使用してコードを問題なくステップ実行できます。

私はここで何が間違っているのですか?

#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代わりに関数を使用することを推奨しています。使用することで、おそらくMATLABのヒープを台無しにします。ドキュメントからmxFreemxArraymxFree

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 に答える