(C6385) Чтение недопустимых данных из массива + Debug Error

Я пишу код для поиска простых чисел решетом Сундарама. Использовал Динамический массив. Из-за него и проблема, я считаю:

#include <iostream>
#include <chrono>
using namespace std;
// Вывод всех простых чисел до 2n решетом Сундарама.
int main()
{
    setlocale(LC_ALL, "Russian");
    int n;

    cout << "Введите число n:" << endl;
    cin >> n;

    bool* nums = new bool[n + 1]; // Объявление динамического массива.
    
    for (int i = 1; i <= n+1; i++)
        nums[i] = true; // <-- Переполнение буфера при записи в "nums": 
                        // доступный для записи объём равен "(n+1)*1" байт, однако записать можно 
                        // только "3" байт.

    int limit = (pow(2 * n + 1, 0.5) - 1) / 2;

    auto start = chrono::high_resolution_clock::now();

    for (int i = 1; i < limit; i++)
    {
        for (int j = i; j < (n - i)/(2 * i + 1); j++)
        {
            nums[2 * i * j + i + j] = false;
        }
    }

    for (int m = 1; m <= n + 1; m++)
    {
        if (nums[m]) cout << 2 * m + 1 << endl; // <-- Чтение недопустимых данных из "nums": 
                                               // доступный для чтения объём равен "(n+1)*1" байт, 
                                               // однако считать можно только "3" байт.
    }

    auto end = chrono::high_resolution_clock::now();

    chrono::duration<float> duration = end - start;
    cout << "Длительность выполнения алгоритма: " << duration.count() << " секунд." << endl;

    delete[]nums;
    nums = NULL;
}

Также просто подсчитываю время его выполнения.

В конце выполнения программы вылезает ошибка:

Debug Error!
<...>
HEAP CORRUPTION DETECTED: after Normal block (#764) at
0x008655A0.
CRT detected that the application wrote to memory after end of heap buffer.

Как понимать эти два предупреждения и Debug Error?


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

Автор решения: Harry
bool* nums = new bool[n + 1]; // Объявление динамического массива.
for (int i = 1; i <= n+1; i++)
    nums[i] = true;

По-моему, вы забыли, что в С/С++ нумерация элементов маассива начинается с 0.

Т.е. последний элемент в nums — n-й! Цикл должен иметь вид

for (int i = 0; i < n+1; i++)
    nums[i] = true;

Ну и соответственно, нужно проверить все прочие обращения к массиву. Я взял в качестве примера только самое первое...

→ Ссылка