我正在进行的一个项目涉及一个飞行器,其 GNC 代码用 C 库 (.out) 编写。我们必须以 .out 库的形式从 LabVIEW(主要的航空电子软件)调用此 C 代码,并且该软件的性质需要静态指针来存储对函数的连续调用之间的数据。我们在整个飞行过程中定期调用 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),但运气不佳,因此非常感谢任何意见或建议。