我在VS2012中运行64位C ++程序,处理图像并将结果写入MAT文件。无论出于何种原因,经过508次迭代后,我得到:
“Program.exe中的____(libmat.dll)未处理的异常:____。访问冲突写入位置____。” (下划线代表地址位置)
但是,如果我在图像编号509上重新启动程序(不改变任何其他内容;只需重新启动),它对下一个508图像工作正常,然后再次向我发送相同的错误。
对较早,不太详细的帖子发表评论说,这可能是一些记忆问题。也许我没有正确处理垃圾收集?我无法理解。
对于记录,保存到文件的所有数据最终都是127x47(行x col)双矩阵。这意味着508个成功文件中的每一个都包含5969个双倍(加上任何元数据都会进入MAT文件)。可能会达到一些内存限制,因为我没有正确清除它?
有问题的代码如下:
void writeMat (void * data, int rows, int cols, std::string fname)
{
// Copies data to MATLAB format matrix
mxArray * mat;
mat = mxCreateDoubleMatrix(rows, cols, mxREAL);
memcpy((void*)mxGetPr(mat), data, rows * cols * sizeof(double));
// Creates output file
MATFile * output;
std::string matFilename = fname + ".mat"; // Output filename
std::string varName = "tmp"; // Storage variable in MAT file
output = matOpen(matFilename.c_str(), "w"); // Opens MAT file for writing
if (output == NULL) {
printf("Error creating file");
}
// Adds data variable to MAT file
int status = matPutVariable(output, varName.c_str(), mat);
if (status != 0)
{
printf("Error writing mat file");
}
mxDestroyArray(mat); // Free up memory
}
任何帮助将不胜感激。提前谢谢!
答案 0 :(得分:1)
您的文件句柄似乎已用完,因为您一直在调用matOpen
,但随后不会调用matClose
。大多数系统对并发打开文件的数量施加了上限 - 在您的系统上看起来这个限制是512 - 已经有一些文件打开,所以当你到达第508次迭代时,你的文件句柄用尽了。
话虽如此,你不应该看到崩溃 - 你在matOpen上有错误检查,当你试图打开太多文件时,这应该会优雅地失败,但显然它没有!