gpt4 book ai didi

c++ - 如果存在内存分配错误,请从 mex 文件中正常退出

转载 作者:行者123 更新时间:2023-11-28 03:36:50 24 4
gpt4 key购买 nike

我有一个 mex 函数,它采用 double 输入 vector ,将精度向下转换为临时单精度 vector ,进行一些处理,然后再次将处理结果向上转换为 double 。

以下简化的代码示例编译并说明了此过程。

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
int xM = mxGetM(prhs[0]);
int xN = mxGetN(prhs[0]);
int totalNumElements = xM*xN;

plhs[0] = mxCreateDoubleMatrix(xM,xN,mxREAL);

double* out = mxGetPr(plhs[0]);
double* in = mxGetPr(prhs[0]);

float out32[totalNumElements];
float in32[totalNumElements];

// ---------> DOWNCAST <---------
for (int mm = 0; mm < totalNumElements; ++mm)
in32[mm] = (float)in[mm];
// ---------- DOWNCAST ----------

// Do some single precision signal processing (just copy for this example)
for (int mm = 0; mm < totalNumElements; ++mm)
out32[mm] = in32[mm];

// ---------> UPCAST <---------
for (int mm = 0; mm < totalNumElements; ++mm)
out[mm] = (double)out32[mm];
// ---------- UPCAST ----------
}

在我的机器上,像这样调用编译的 mex 函数工作正常。 .

>> x = randn(1e6,1); y=demo(x);

...但是这样调用会导致 Matlab 意外关闭

>> x = randn(1e7,1); y=demo(x);

鉴于崩溃是由输入 vector 的大小增加引起的,我猜测错误是由于内存分配失败造成的。如果发生此类错误,我如何优雅地退出到 Matlab 并给出错误消息?谢谢。

最佳答案

方法一

好的,一种方法是用 C 风格替换堆栈分配的变量。 . .

 float*  in32  =  (float*)mxCalloc(totalNumElements, sizeof(float));
float* out32 = (float*)mxCalloc(totalNumElements, sizeof(float));

当出现内存错误时,Matlab 巧妙地给出如下错误。 . .

Error using demo Out of memory.

Type HELP MEMORY for your options.

不需要 try-catch block 或异常。

方法二

另一种方法是使用 C++ 风格的 std::exception。堆栈分配的变量可以替换为以下...

  float*  in32;
float* out32;
try
{
in32 = new float[totalNumElements];
out32 = new float[totalNumElements];
}
catch (std::exception& e)
{
std::string msg = std::string("Aw snap: ") + e.what();
mexErrMsgTxt(msg.c_str());
}

当出现内存错误时,Matlab 巧妙地给出如下错误。 . .

Error using demo

Aw snap: std::bad_alloc

注意事项

方法 1 更紧凑,并且与 mex API 集成得更好。最好在 mex 网关函数中使用方法 1,在库中使用方法 2,该库的用途可能不仅仅是制作 Matlab 扩展。这两种方法都需要你使用mxFree(mxCalloc方案)或者delete(new方案)才能收费在堆上为 in32out32 分配的内存。我仍然不知道如何检测或处理堆栈溢出

关于c++ - 如果存在内存分配错误,请从 mex 文件中正常退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10618962/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com