写入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 上进行了错误检查,当您尝试打开太多文件时这应该会正常失败,但显然不会!
我是 运行 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 上进行了错误检查,当您尝试打开太多文件时这应该会正常失败,但显然不会!