编写MAT文件:508次成功调用后访问冲突写入位置

时间:2015-05-20 05:03:13

标签: c++ mat-file

我在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
}

任何帮助将不胜感激。提前谢谢!

1 个答案:

答案 0 :(得分:1)

您的文件句柄似乎已用完,因为您一直在调用matOpen,但随后不会调用matClose。大多数系统对并发打开文件的数量施加了上限 - 在您的系统上看起来这个限制是512 - 已经有一些文件打开,所以当你到达第508次迭代时,你的文件句柄用尽了。

话虽如此,你不应该看到崩溃 - 你在matOpen上有错误检查,当你试图打开太多文件时,这应该会优雅地失败,但显然它没有!