写入MAT文件:508次呼叫成功后访问违规写入位置
Writing MAT files: Access violation writing location after 508 successful calls
我正在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
}
任何帮助都会很感激。提前感谢!
似乎您的文件句柄已用完,因为您一直调用matOpen
,但随后不调用matClose
。大多数系统对并发打开的文件数量都有上限——在您的系统上,这个限制似乎是512个——已经有几个文件打开了,所以当您进行第508次迭代时,您的文件句柄就用完了。
话虽如此,你不应该看到崩溃-你有错误检查matOpen,这应该失败优雅当你试图打开太多的文件,但显然它没有!
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 使用迭代器时如何访问对象在向量中的位置?
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- Cuda:访问违规写入位置0x0000000000000000
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 访问特定阵列位置/索引时出现分段错误
- 创建一个类来访问和指定向量类型,并构建一个获取位置并为其分配区域的类
- (此函数用于计算 SMA).在 FA.exe 中0x00509159引发异常: 0xC0000005:访问冲突读取位置0
- 0xC0000005:读取位置0xCDCDCDC1时发生访问冲突
- 0xC0000005:读取位置0xCDCDCDCD时发生访问冲突
- 读取类的析构函数中的位置时发生访问冲突
- 在尝试使用CUDA分配内存时,我遇到了访问冲突写入位置错误
- 快速访问 ifs() C++中的文件位置
- 创建 2D 数组0xCCCCCCCC访问冲突写入位置
- 0x0F50DF58:0xC0000005:访问冲突读取位置0x0047CA04时未处理的异常
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 处于默认参数位置的 Lambda 无法访问好友成员。这是编译器错误吗?
- 在 C 代码中调用 Python 函数时第三次出现访问冲突写入位置错误
- 确定打开进程的内存访问位置