未选择/ clr时编译的Matlab代码崩溃

时间:2014-03-06 21:52:00

标签: c# c++ .net visual-studio-2010 matlab

我想知道为什么我在编译的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

1 个答案:

答案 0 :(得分:0)

我工作的程序员想出了这个......

选择/ clr时,未初始化的指针设置为NULL。 未选择/ clr时,调试器将未初始化的指针设置为任意值。然后,当调用mlfTestVarPass时,Matlab的内存管理会看到一个任意的mxArray并尝试释放未分配的内存。

这解释了崩溃,然而,我们仍然不明白为什么有这么多的第一次机会异常。它可能只是反映了Mathworks如何编写代码。