私が取り組んでいるプロジェクトには、Cライブラリ(.out)に記述されたGNCコードを備えた飛行体が含まれます。このCコードをLabVIEW(主要なアビオニクスソフトウェア)から.outライブラリの形式で呼び出す必要があります。ソフトウェアの性質上、関数への連続する呼び出しの間にデータを格納するために静的ポインタが必要です。フライト中、定期的にGNC実行機能を呼び出します。現在、WindowsのDLLでMatlab MEXラッパーを使用してこの関数を呼び出そうとしていますが、これにより、いくつかのメモリ管理の問題が明らかになりました。
私はこのような関数の最初に構造を宣言しています:
static Nav_str *Nav_IN_OUT_ptr;
static hguid_ref *Guid_IN_OUT_ptr;
static HopControl *Control_IN_OUT_ptr;
Nav_IN_OUT_ptr = (Nav_str *)malloc(sizeof(Nav_str));
Guid_IN_OUT_ptr = (hguid_ref *)malloc(sizeof(hguid_ref));
Control_IN_OUT_ptr = (HopControl *)malloc(sizeof(HopControl));
これは、関数の実行ごとに発生します。ただし、この関数が数回繰り返し呼び出された後、終了しようとすると、常にメモリセグメンテーション違反でクラッシュします。私の理解では、この記憶はそれ自体をきれいにするはずだったのですが、それは間違っていますか?
手動でクリーンアップするために、これらの行を最後に追加して、クリーンアップの反復でのみ呼び出されるようにしました。
free(Nav_IN_OUT_ptr);
free(Guid_IN_OUT_ptr);
free(Control_IN_OUT_ptr);
これは、このメモリを解放する正しい方法ですか?このメモリを解放できますか?Cが最後の呼び出し後にメモリを適切に放棄しなかった、またはMatlabがメモリを適切に管理しなかった以外に、セグメンテーションエラーの別の理由があるのでしょうか。運が悪かったので(Mathworksに連絡しても)同様の問題を抱えている人を探し回ったので、コメントや提案をいただければ幸いです。