4

我有调用从 c++ 代码生成的 MEX 的 Matlab 代码。c++ 代码在初始化时需要大量的内存分配和计算。使用静态指针,仅在第一次调用时进行初始化,并在后续调用中读取指针。

在使用 Matlab 编译器编译此 Matlab 代码之前,一切正常。现在对 MEX 的后续调用(现在在 matlab 编译代码中发生)最终崩溃,因为静态指针显然引用了无效内存。

在这种情况下可以做些什么来避免重复初始化?

谢谢,狮子座

4

2 回答 2

1

很好的问题。您可能必须将其分解为两个不同的 mex 函数,一个计算初始化并返回其结果,另一个执行您的函数。

  [heavyCompResults,otherHeavyResults] = initComputation(initParams);

然后:

  performComputation(compParams,heavyCompResults,otherHeavyResults);

或者,您可以将内容写在文件中,而不是通过 Matlab 传递。

  initComputation(initParams,initResultsFname);  %writes initResultsFname

然后:

  performComputation(compParams,initResultsFname); %reads initResultsFname

另一种选择:

将您的代码制作成 DLL 并使用loadLibraryMatlab 中的函数。这样,当您创建静态时,它可能应该在调用之间保留在内存中。但我还没有验证这一点。

于 2011-10-07T23:12:06.727 回答
0

我不确定你是否已经解决了你的问题,但这里有一些对我有帮助的相关信息。

这似乎与我遇到的问题相似。在编译同一函数的新版本时(其中一个存在内存访问问题),我发现旧版本的 mex 函数实际上并没有离开内存。我尝试了很多事情,包括(据说)使用 clear mex-file-name从 matlab 内存中清除 mex 函数。防止重复访问我发现的相同有缺陷的 mex 函数的唯一成功方法是重新启动 matlab。这每次都解决了内存问题。虽然这种情况和解决方案与您的问题不完全匹配,但我的建议是尝试重新启动 matlab。希望有帮助。

于 2012-06-24T06:53:27.640 回答