【问题标题】:Compiled Matlab code crashes when /clr is not selected未选择 /clr 时编译的 Matlab 代码崩溃
【发布时间】:2014-03-06 21:51:59
【问题描述】:

我想知道为什么我在编译的 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...一切正常。 如果我在构建项目时公共语言运行时支持设置为:无...首先,调试器在调用 mylibInitialize 时会抛出许多异常。最常见的是:varflowFailed、tffFailed、CryptoPP、jitCgFailed 和 xsd_binder::MalformedDocumentError。其次,mlfTestVarPass 调用因访问冲突而崩溃。

我和我一起工作的程序员都想知道为什么。

其他信息: Windows 7的 视觉工作室 2010,SP1 视窗 SDK 7.1 Matlab 2013b

【问题讨论】:

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


    【解决方案1】:

    与我一起工作的程序员发现了这一点......

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      相关资源
      最近更新 更多