Вызвано исключение по адресу 0x00007FFBEEEB2F40A (ucrtbased.dll) : 0xC0000005; нарушение прав доступа при чтении по адресу
При выводе следующей программы (код см. ниже)
#include <iostream>
#include <thread>
#include <semaphore>
using namespace std;
// объявляем функцию для вычисления границы, которая будет разделять два массива
int bound_div (int iteration, int n) {
// создаем массив , куда будем записывать данные
int bound_array [3];
// находим новые элементы массива
// рекурсивная функция здесь
for (int i = 0; i < 2; i++) {
if (i == 0) {
if (n % 2 == 0) {
bound_array[i] = n / 2;
}
else {
bound_array[i] = n / 2 + 1;
}
}
else {
if (n % 2 == 0) {
bound_array[i] = bound_array[i - 1] / 2;
}
else {
bound_array[i] = bound_array[i - 1] / 2 + 1;
}
}
}
// запишем значение границы
int bound = bound_array[iteration];
return bound;
}
// функция для нахождения среза массива
double* array_slice(double* array, int a, int b) {
double* slice = new double[b - a];
for (int i = a; i < b; i++) {
slice[a-i] = array[i];
}
return slice;
}
// функция для вычисления суммы элементов, обратных элементам массива
double bar(double sum, double* squares, int b)
{
for (int i = 0; i < b; i++) {
sum += 1 / squares[i];
std::cout << "Sum is " << sum << "\n";
}
return sum;
}
// сделаем функцию, которая будет выполняться потоком
void united_function (double sum, double* squares, int a, int b) {
bar(sum, array_slice(squares, a, b), b);
}
int main()
{
// запрашиваем переменную
int n;
// запросим у пользователя количество элементов массива
cout << "Sum 1/ArEls\nThe program finds the sum of elements inversing array elements\nEnter the number of array elements:\n";
cin >> n;
// создаем массив
double* squares = new double[n];
// инициализируем массив
for (int i = 1; i < n + 1; i++) {
squares[i - 1] = i * i;
}
// создаем счетчик для суммы в последовательном варианте
double sum_seq = 0;
// создаем счетчики для суммы в параллельном варианте
cout << "Parallel variant\n";
double sum_par_1 = 0;
double sum_par_2 = 0;
// создаем счетчик для итерации
int iteration = 0;
// передаем сумму потокам
if (n > 100) {
// сделаем новую переменную
int bound = bound_div(iteration, n);
// поток
std::thread thread(united_function, sum_par_1, squares, 0, bound);
thread.detach();
// функция в главном потоке
united_function(sum_par_2, squares, bound, n);
// считаем общую сумму
double sum_par = sum_par_1 + sum_par_2;
// выводим ее на экран
cout << "The general sum is " << sum_par << endl;
}
else {
double sum_par = 0;
bar(sum_par, squares, n);
// выводим ее на экран
cout << "The general sum is " << sum_par << endl;
}
// записываем последовательный вариант
cout << "Sequential variant\n";
bar(sum_seq, squares, n);
cout << "\n";
// выводим результат на экран
cout << "The general sum is " << sum_seq << endl;
}
появляется следующая ошибка:
Вызвано исключение по адресу 0x00007FFCB014E210 (ntdll.dll) в Lab_1_final_version_new_2.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFFFFFFFFFFFFFFFF.
Скриншот:

Действительно ли эта ошибка связана с рекурсивной функцией? И как ее исправить?