2012-02-08 81 views
0

我使用MATLAB的mxDestroyArray() function,想知道如何做适当的错误处理。MATLAB C API:mxDestroyArray(NULL)是做什么的?

如果我打电话mxCreate*Array()或类似,我会得到一个有效的成功指针和NULL失败,即我。即如果内存已满。

如果我以这种方式创建了几个数组,并且至少有一个失败,我想释放所有我不需要的东西。

这里我想知道:我需要明确检查每个值吗?

if (error) { 
    if (a) mxDestroyArray(a); 
    if (b) mxDestroyArray(b); 
    if (c) mxDestroyArray(c); 
} 

还是我可以省略检查?

if (error) { 
    mxDestroyArray(a); 
    mxDestroyArray(b); 
    mxDestroyArray(c); 
} 
+0

我不确定,但我认为如果没有足够的内存,matlab会直接从您的mex文件中取出。在这种情况下,也许你仍然可以捕获一个异常或其他东西...无论如何,你可以键入'编辑([matlabroot'/extern/examples/refbook/matrixDivideComplex.c']);'看到由Mathworks编码的mex文件,在调用'mxDestroyArray'之前,它们什么都不做。 – Oli 2012-02-08 20:03:30

+0

@Oli在mex文件的情况下,你是对的。但也有另一个方向 - 从外部程序调用MATLAB - 这是目前我的问题。在那里你可以得到一个NULL。 – glglgl 2012-02-08 23:49:06

回答

2

只需尝试一下,看看matlab崩溃。我认为你需要检查,因为你也使用普通的C做的null没有引用一个有效的内存地址

+0

免费(),我不需要支票 - 这很方便。对于检查:问题是,如果它现在起作用,则不能保证它在更高版本中也能正常工作。但是,我会明天再来看看。 – glglgl 2012-02-08 23:50:50

+0

我刚测试过,程序没有崩溃。所以我想它是有效的。尽管如此,我现在会保留它... – glglgl 2012-02-09 09:42:59

2

我不认为这是必要的,我不打算清理这样的内存少数原因:

  1. 如果调用mxCreate *函数失败,很可能是因为内存不足。 对于某些版本的MEX API,这将导致分段违规,您将不会有机会进行清理。

  2. 当MEX函数终止或有一个调用mxErr时,MATLAB将自动销毁不是从plhs []中的MEX函数返回的数组。

+0

我正在考虑另一个方向:从外部调用MATLAB。在这里,什么都不会被破坏。我想尽量避免内存泄漏,因为我的程序有时需要运行数天。 – glglgl 2012-02-08 23:51:52