Ошибка с динамическим массивом
Задание: Считать с файла все числа и записать в динамический массив(начальная длина 100), если массив переполнен, удвоить с помощью dblMem. При работе с файлом до 100 всё нормально, но если чисел больше выскакивает ошибка(Вызвано исключение по адресу 0x772B18C1 (ntdll.dll) в test.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x0000003F. )
#include <iostream>
#include <string>
#include <fstream>
#include <iomanip>
using namespace std;
string GetPath();
bool readArray(int*& begin, int*& end, int*& last, ifstream& fin);
bool dblMem(int*& begin, int*& end);
void main()
{
int N = 100;
int* begin = new int\[N\];
int* end = begin + N;
int* last = begin;
string path;
ifstream s;
while (true)
{
cout << "Enter path to infile: ";
path = GetPath();
s.open(path);
if (s)
break;
else if (path == "")
{
path = "in.txt";
s.open(path);
cout << " path = in.txt" << endl;
break;
}
else
s.clear();
}
readArray(begin, end, last, s);
}
string GetPath()
{
string path;
getline(cin, path, '\n');
return path;
}
bool readArray(int*& begin, int*& end, int*& last, ifstream& fin)
{
int temp;
while (fin >> temp)
{
if (last == end && !dblMem(begin, end))
return false;
*(last++) = temp;
}
return true;
}
bool dblMem(int*& begin, int*& end)
{
cout << "DblMem";
int length = end - begin;
int* temp = new(nothrow) int\[2 * length\]; // новий масив подвоєної довжини
if (temp == nullptr) // ознака неуспішності
return false;
for (int i = 0; i < length; ++i) // копіювання вмісту в новий масив
*(temp + i) = *(begin + i);
delete\[\] begin; // знищення наявного масиву
begin = temp;
length = 2 * length; // нова довжина
end =begin + length;
return true;
}
Ответы (1 шт):
Автор решения: Павел Ериков
→ Ссылка
Функция dblMem изменяет begin и end, но last все еще указывает на конец удаленного массива. То есть после функции dblMem вам нужно изменить last так, чтобы он указывал в вашем случае на середину новой выделенной памяти.
Примерно вот так:
if (last == end) {
int tmp = end - begin;
if (dblMem(begin, end))
last = begin + tmp;
else return false;
}