Unexpected Standard exception from MEX file. What() is: bad allocation。new 分配內存(如 vector、動態數組)未在 MEX 函數退出前 delete,MATLAB 進程不退出,內存累積耗盡。plhs 未正確創建/賦值,或輸入 prhs 被錯誤修改。mexErrMsgIdAndTxt,導致進程不穩定。std::vector、std::unique_ptr、std::string)替代裸 new/delete。void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
try {
// 核心邏輯
// 輸入校驗
// 計算
// 創建輸出 mxArray
} catch (const std::exception &e) {
mexErrMsgIdAndTxt("MyToolbox:Error", e.what());
} catch (...) {
mexErrMsgIdAndTxt("MyToolbox:Unknown", "Unknown C++ exception");
}
}
mexAtExit 註冊清理函數,或改為持久化數組 mexMakeArrayPersistent(需手動釋放)。mxCreateDoubleMatrix / mxCreateNumericArray 創建輸出mxGetPr / mxGetData 讀取輸入prhs 指向的內存**-DDEBUG 或用 mex -g 編譯調試版,配合 Valgrind/AddressSanitizer(需 Linux)定位洩漏。> clear mex % 強制卸載所有 MEX 文件,釋放內存
> myMexFunc(args) % 重新加載運行
> myMexFunc(args) % 再次運行,觀察是否穩定
MEX 函數重複運行崩潰核心是 **C++ 內存管理缺陷在 MATLAB 長壽命進程中放大**。強制 RAII、統一異常捕獲轉 mexErrMsg、避免靜態殘留、規範 mxArray 操作,並用 clear mex 驗證隔離性,即可穩定運行。