我有调用从 c++ 代码生成的 MEX 的 Matlab 代码。c++ 代码在初始化时需要大量的内存分配和计算。使用静态指针,仅在第一次调用时进行初始化,并在后续调用中读取指针。
在使用 Matlab 编译器编译此 Matlab 代码之前,一切正常。现在对 MEX 的后续调用(现在在 matlab 编译代码中发生)最终崩溃,因为静态指针显然引用了无效内存。
在这种情况下可以做些什么来避免重复初始化?
谢谢,狮子座
我有调用从 c++ 代码生成的 MEX 的 Matlab 代码。c++ 代码在初始化时需要大量的内存分配和计算。使用静态指针,仅在第一次调用时进行初始化,并在后续调用中读取指针。
在使用 Matlab 编译器编译此 Matlab 代码之前,一切正常。现在对 MEX 的后续调用(现在在 matlab 编译代码中发生)最终崩溃,因为静态指针显然引用了无效内存。
在这种情况下可以做些什么来避免重复初始化?
谢谢,狮子座
很好的问题。您可能必须将其分解为两个不同的 mex 函数,一个计算初始化并返回其结果,另一个执行您的函数。
[heavyCompResults,otherHeavyResults] = initComputation(initParams);
然后:
performComputation(compParams,heavyCompResults,otherHeavyResults);
或者,您可以将内容写在文件中,而不是通过 Matlab 传递。
initComputation(initParams,initResultsFname); %writes initResultsFname
然后:
performComputation(compParams,initResultsFname); %reads initResultsFname
另一种选择:
将您的代码制作成 DLL 并使用loadLibrary
Matlab 中的函数。这样,当您创建静态时,它可能应该在调用之间保留在内存中。但我还没有验证这一点。
我不确定你是否已经解决了你的问题,但这里有一些对我有帮助的相关信息。
这似乎与我遇到的问题相似。在编译同一函数的新版本时(其中一个存在内存访问问题),我发现旧版本的 mex 函数实际上并没有离开内存。我尝试了很多事情,包括(据说)使用 clear mex-file-name从 matlab 内存中清除 mex 函数。防止重复访问我发现的相同有缺陷的 mex 函数的唯一成功方法是重新启动 matlab。这每次都解决了内存问题。虽然这种情况和解决方案与您的问题不完全匹配,但我的建议是尝试重新启动 matlab。希望有帮助。