Запись файлов MAT: место записи о нарушении доступа после 508 успешных вызовов

Я использую 64-битную программу C ++ в VS2012, которая обрабатывает изображения и записывает результаты в файл MAT. По какой-то причине после 508 рабочих итераций я получаю:

«Необработанное исключение в ____ (libmat.dll) в Program.exe: ____. Место записи нарушения доступа ____.» (Подчеркивания представляют адреса адресов)

Тем не менее, если я перезапущу программу на изображении с номером 509 (ничего не меняя; просто перезапуск), она будет отлично работать для следующих 508 изображений, а затем снова выдаст мне ту же ошибку.

В комментарии к более раннему, менее подробному сообщению говорилось, что это может быть проблема с памятью. Возможно, я не занимаюсь сборкой мусора должным образом? Я не могу понять это все же.

Для записи, все данные, сохраняемые в файлы, попадают в двойную матрицу 127×47 (строка 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
}

Любая помощь будет оценена. Заранее спасибо!

0

Решение

Похоже, у вас заканчиваются файловые дескрипторы, потому что вы продолжаете вызывать matOpen но потом не звони matClose, Большинство систем накладывают верхний предел на количество одновременно открытых файлов — может показаться, что в вашей системе этот предел равен 512 — уже открыто несколько файлов, поэтому, когда вы приближаетесь к 508-й итерации, у вас заканчиваются дескрипторы файлов.

Сказав это, вы не должны видеть сбой — у вас есть проверка ошибок на matOpen, и она должна завершиться неудачно, когда вы пытаетесь открыть слишком много файлов, но, очевидно, это не так!

1

Другие решения


По вопросам рекламы [email protected]