未选择 /clr 时编译的 Matlab 代码崩溃
Posted
技术标签:
【中文标题】未选择 /clr 时编译的 Matlab 代码崩溃【英文标题】:Compiled Matlab code crashes when /clr is not selected 【发布时间】: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
【问题讨论】:
【参考方案1】:与我一起工作的程序员发现了这一点......
选择/ clr时,未初始化的指针设置为null。 当未选择 /clr 时,调试器会将未初始化的指针设置为任意值。然后,当调用 mlfTestVarPass 时,Matlab 的内存管理看到一个任意的 mxArray 并尝试释放未分配的内存。
这解释了崩溃,但是,我们仍然不明白为什么会有这么多第一次机会异常。它可能只是反映了 Mathworks 是如何编写代码的。
【讨论】:
以上是关于未选择 /clr 时编译的 Matlab 代码崩溃的主要内容,如果未能解决你的问题,请参考以下文章
使用 fopen 文件时,matlab 在没有转储文件的情况下崩溃