我想知道为什么我在编译的Matlab库中使用的代码在未选择公共语言运行库时崩溃。 对于一个最小的例子,我尝试将以下Matlab函数编译到共享库中:
function [volOut, volAvg]=testVarPass(volIn)
volOut=double(volIn);
volAvg=mean(volOut(:));
end
使用以下对mcc的调用: mcc -B csharedlib:mylib testVarPass.m
接下来,我已经设置了Visual Studios 2010控制台项目。
#include "stdafx.h"
#include "matrix.h"
#include "mylib.h"
int _tmain(int argc, _TCHAR* argv[])
{
mxArray *vol_in;
mxArray *vol_out;
mxArray *vol_avg;
mwSize dim_list[3];
double *vol_avg_ptr;
dim_list[0]=10;
dim_list[1]=10;
dim_list[2]=10;
if( !mclInitializeApplication(NULL,0) ) { //initialize Matlab Compiler Runtime
return -1;
}
if (!mylibInitialize()) //initialize library
{
return -2;
}
vol_in=mxCreateNumericArray(3,dim_list, mxINT16_CLASS, mxREAL); //make a sample 3d array
mlfTestVarPass(2, &vol_out, &vol_avg, vol_in); //crashes here
vol_avg_ptr=mxGetPr(vol_avg);
/* Call the MCR and library termination functions */
mylibTerminate();
mclTerminateApplication();
return 0;
}
如果我使用公共语言运行时支持将项目构建为:/ clr...everything工作正常。 如果我将公共语言运行时支持的项目设置为:nothing ...首先,调试器会在调用mylibInitialize时呕吐许多异常。最常见的是:varflowFailed,tffFailed,CryptoPP,jitCgFailed和xsd_binder :: MalformedDocumentError。其次,mlfTestVarPass调用因访问冲突而崩溃。
我和我正在合作的程序员都在想为什么。
其他资讯: Windows 7的 Visual Studio 2010,SP1 Windows SDK 7.1 Matlab 2013b
答案 0 :(得分:0)
我工作的程序员想出了这个......
选择/ clr时,未初始化的指针设置为NULL。 未选择/ clr时,调试器将未初始化的指针设置为任意值。然后,当调用mlfTestVarPass时,Matlab的内存管理会看到一个任意的mxArray并尝试释放未分配的内存。
这解释了崩溃,然而,我们仍然不明白为什么有这么多的第一次机会异常。它可能只是反映了Mathworks如何编写代码。