写入MAT文件:调用508次成功后访问违规写入位置

Writing MAT files: Access violation writing location after 508 successful calls

我是 运行 VS2012 中的 64 位 C++ 程序,用于处理图像并将结果写入 MAT 文件。无论出于何种原因,在 508 次工作迭代后,我得到:

"Unhandled exception at ____ (libmat.dll) in Program.exe:____. Access violation writing location ____."(下划线代表地址位置)

但是,如果我在图像编号 509 上重新启动程序(什么都不改变;只是重新启动),它对接下来的 508 个图像工作正常,然后再次给我同样的错误。

对较早的较不详细的评论 post 说这可能是一些内存问题。也许我没有正确处理垃圾收集?不过我想不通。

郑重声明,所有保存到文件的数据最终都以 127x47(行 x 列)双矩阵形式显示。这意味着 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
}

如有任何帮助,我们将不胜感激。提前致谢!

您似乎 运行 正在用完文件句柄,因为您一直调用 matOpen 但随后没有调用 matClose。大多数系统都对同时打开的文件数量施加了上限——在你的系统上这个限制似乎是 512——已经有几个文件打开了,所以当你到达第 508 次迭代时,你 运行 out文件句柄数。

话虽如此,您应该不会看到崩溃 - 您在 matOpen 上进行了错误检查,当您尝试打开太多文件时这应该会正常失败,但显然不会!