Несколько нарушений доступа ifstreams - PullRequest
1 голос
/ 17 ноября 2011

Я пытаюсь реализовать внешнюю сортировку слиянием ( wiki ) и хочу открыть 2048 потоков и читать данные в личные буферы.

ifstream *file;
file = (ifstream *)malloc(2048 * sizeof(ifstream));

for (short i = 0; i < 2048; i++) {
    itoa(i, fileName + 5, 10);
    file[i].open(fileName, ios::in | ios::binary); // Access violation Error
    if (!file[i]) {
        cout << i << ".Bad open file" << endl;          
    }
    if (!file[i].read((char*)perfile[i], 128*4)) {
        cout << i << ". Bad read source file" << endl;
    }       
}

Но происходит сбой при

Необработанное исключение в 0x58f3a5fd (msvcp100d.dll) в sorting.exe: 0xC0000005: Место чтения нарушения доступа 0xcdcdcdfd.

Можно ли использовать так много открытых открытых потоков?Или, может быть, это очень плохая идея - открыть 2048 ifstreams, и есть лучший способ реализовать этот алгоритм?

Ответы [ 5 ]

4 голосов
/ 17 ноября 2011

Массивы не POD-объектов выделяются с new, а не с malloc, в противном случае конструкторы не запускаются.

Ваш код получает неинициализированную память и «интерпретирует» ее как ifstream s, что, очевидно, приводит к сбою (потому что конструктор класса не был запущен, даже если указатели виртуальных таблиц находятся на месте).

Вы можете разместить все свои объекты в стеке:

ifstream file[2048];

или выделите их в куче, если занятость стека является проблемой;

ifstream *file=new ifstream[2048];
// ...
delete[] file; // frees the array

(хотя здесь следует использовать умный указатель, чтобы избежать утечек памяти в случае исключений)

или, что лучше, используйте vector из ifstream (требуется заголовок <vector>):

vector<ifstream> file(2048);

, которые не требуют явного освобождения его элементов.

(теоретически, вы могли бы использовать malloc, а затем использовать размещение new, но я бы не рекомендовал его вообще)

<ч />

... кроме того, одновременное открытие 2048 файлов не является хорошей идеей ...

4 голосов
/ 17 ноября 2011

Это C ++. ifstream не является POD, поэтому вы не можете просто разместить его неправильно: экземпляры должны получить constructed

ifstream file[2048];

for (short i = 0; i < 2048; i++) {
    itoa(i, fileName + 5, 10);
    file[i].open(fileName, ios::in | ios::binary); // Access violation Error
    if (!file[i]) {
        cout << i << ".Bad open file" << endl;          
    }
    if (!file[i].read((char*)perfile[i], 128*4)) {
        cout << i << ". Bad read source file" << endl;
    }       
}

Кроме того, открытие 2048 файлов не похоже на хороший план, но вы можете понять это позже

4 голосов
/ 17 ноября 2011

Значение 0xcdcdcdcd используется VS в режиме отладки для представления неинициализированной памяти (также следите за 0xbaadf00d).

Вы используете malloc, который имеет наследие C и делает не вызывает конструкторов, он просто дает вам указатель на кусок данных.ifstream не является типом POD (Plain Old Data);вам нужно вызвать его конструктор для правильной инициализации.Это C ++;используйте new и delete.

Еще лучше, не используйте также;просто создайте объект в стеке и позвольте ему обрабатывать динамическое распределение памяти так, как это было задумано.

Конечно, это даже не затрагивает ужасную идею открытия файлов 2048, но вам, вероятно, следуетузнать это трудным путем ...

0 голосов
/ 17 ноября 2011

Насколько я вижу, вам вообще не нужен массив из 2048 отдельных ifstream здесь.Вам нужно только один ifstream в любой момент времени, поэтому на каждой итерации вы закрываете один файл и открываете другой.Уничтожение ifstream автоматически закрывает файл, поэтому вы можете сделать что-то вроде этого:

for (short i = 0; i < 2048; i++) {
    itoa(i, fileName + 5, 10);
    ifstream file(fileName, ios::in | ios::binary);
    if (!file) {
        cout << i << ".Bad open file" << endl;          
    }
    if (!file.read((char*)perfile[i], 128*4)) {
        cout << i << ". Bad read source file" << endl;
    }       
}
0 голосов
/ 17 ноября 2011

Вы не можете открыть 2048 файлов, для открытых файлов существует ограничение операционной системы

...