Ошибка с динамическим массивом

Задание: Считать с файла все числа и записать в динамический массив(начальная длина 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;
}
→ Ссылка