Ошибка при копировании динамического массива С++

Я только начал изучать С++, и столкнулся с очень странной проблемой, я написал функцию CopyArr для копирования динамического массива

#include <iostream>

void FillArr(int* const arr, const int size);
void CopyArr(const int* const fromArr, int* toArr, const int sizefrom);
void ShowArr(const int* const arr, const int size);

int main()
{
    int size = 3;
    int* fArr = new int[size];
    int* sArr = new int[size];

    FillArr(fArr, size);
    FillArr(sArr, size);

    ShowArr(fArr, size);
    ShowArr(sArr, size);

    std::cout << "___Copied___\n";

    CopyArr(fArr, sArr, size);

    /*  Тоже самое, но работает всегда если реализовать в main
    
    delete[] sArr; 
    sArr = nullptr;
    sArr = new int[size];

    for (int i = 0; i < size; i++)
    {
        sArr[i] = fArr[i];
    }*/

    ShowArr(fArr, size);
    ShowArr(sArr, size);

    delete[] fArr;
    delete[] sArr;

}

void FillArr(int* const arr, const int size) 
{
    for (int i = 0; i < size; i++) 
    {
        arr[i] = rand() % 10;
    }
}

void ShowArr(const int* const arr, const int size) 
{
    for (int i = 0; i < size; i++)
    {
        std::cout << arr[i] << " ";
    }

    std::cout << std::endl;
}

void CopyArr(const int* const fromArr, int* toArr, const int sizefrom) 
{
    delete[] toArr;
    toArr = nullptr;
    
    toArr = new int[sizefrom];

    for (int i = 0; i < sizefrom; i++) 
    {
        toArr[i] = fromArr[i];
    }
}

И проблема в том, что этот код может 2-3 раза подряд отработать без ошибок, а на четвертый выкинуть исключение на delete[] sArr, из-за очистки уже очищенного участка памяти.

Вот, что в таком случае выводится в консоль:

Отмечу, что такого не происходит если реализовать логику этой функции непосредственно в main, в таком виде код работает стабильно.

И ещё одно наблюдение, чем больше размер массивов, тем реже вылетают исключения.

Буду рад если кто-нибудь сможет объяснить, почему такое происходит именно с функцией, и почему результат очень непостоянный?


Ответы (0 шт):