При переходе с Debug на Release, выдает: Необработанное исключение по адресу: Куча была повреждена (параметры: 0x00007FF8470397F0)

Запускал программу на Debug, все работало нормально, при переходе на Release стало ругаться, причем если проигнорировать предупреждения, код работает как задумано. Раньше не работал с Release, и не знаю где ошибка.

//Программа реализации ДКА
#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <iostream> 
#include <string.h> 
#include <windows.h> 
#include <locale.h> 
#include <wchar.h> 
#include <algorithm> 
#define N 18 

using namespace std;

/* Структура, описывающая узел графа
char psevdonim[4] - имя данного узла
Item* a - указатель на следующий узел графа, находящийся по дуге a
Item* b - указатель на следующую узел графа, находящийся по дуге b
Item* с - указатель на следующую узел графа, находящийся по дуге c
Item* d - указатель на следующую узел графа, находящийся по дуге d
bool YorN - значение, определяющее, является ли данный узел допускающим или нет
*/

struct Item {
    char psevdonim[4] = "";
    Item* a = nullptr;
    Item* b = nullptr;
    Item* c = nullptr;
    Item* d = nullptr;
    bool YorN;
};

typedef Item* point;

/*
Функция обработки данных из таблицы переходов
char* boo - указатель на обрабатываемый элемент
return: номер узла, соответствующий элементу
*/
int char_to_int(char* boo);



/*
Функция форматированного вывода
const char* bufer - указатель на обрабатываемый символ алфовита, по которому производится переход
Item*& head - ссылка на первый элемент графа
return: ничего
*/
void output(const char* bufer, Item*& head);

/*
Функция инициалиализации графа
point*& Points - ссылка на выделенное для графа место
return: ничего
*/
void init_graph(point*& Points);

/*
Функция проверки, соответствует ли введенная последовательность алфавиту
string bufer - проверяемая строка
return: true - соответствует
false - не соответствует
*/
bool check(string bufer);

int main() {
setlocale(LC_ALL, "rus");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

point* Points = (point*)calloc(N + 1, sizeof(Item*));
init_graph(Points);

bool first_enter = true;
bool MyExit = true;
bool next_enter = false;
do {
    int cont = 1;
    string bufer;
    if (first_enter) {
        cout << "Введите входную цепочку, закончив её символом \"!\": ";
    }
    if (next_enter) {
        cout << "\nВходная цепочка: ";
    }
    cin >> bufer;
    first_enter = false;
    if (check(bufer)) {
        point head = Points[1];
        int i = 0; char boo;
        do {
            boo = bufer[i];
            output(&boo, head);
            i++;
        } while (boo != '!');
        cout << (!(head->YorN) ? " -> false" : (head != Points[1]) ? " -> true" : "q0 -> true");
        cout << "\nВведи next при необходимости проверить ещё одну цепочку\n";
        string flag;
        cin >> flag;
        if (flag != "next")
            MyExit = false;
        else {
            first_enter = false;
            next_enter = true;
            cont = 1;
        }
    }
    else {
        string flag;
        cout << "\nУсловия читай, пожалуйста.\n";
        cout << "Введи next, если тебе нужна еще одна попытка\n";
        cin >> flag;
        if (flag != "next")
            MyExit = false;
        else {
            first_enter = true;
            next_enter = false;
            cont = 1;
        }
    }
} while (MyExit);

for (int i = 1; i <= N; ++i) {
    free(Points[i]);
}
free(Points);

return 0;
}



bool check(string bufer) {
bool flag_check = true;
char boo; int cont = 0;
do {
    boo = bufer[cont];
    if (cont >= bufer.length()) flag_check = false;
    if (!(boo == '!' || boo == 'a' || boo == 'b' || boo == 'c' || boo == 'd')) flag_check = false;
    cont++;
} while (boo != '!' && flag_check);
return flag_check;
}



void output(const char* bufer, Item*& head) {
char boo = *bufer;
if (boo == 'a') {
    cout << "\na: " << head->psevdonim[0] << head->psevdonim[1] << head->psevdonim[2] << " -> " << head->a->psevdonim[0] << head->a->psevdonim[1] << head->a->psevdonim[2];
    head = head->a;
}
else if (boo == 'b') {
    cout << "\nb: " << head->psevdonim[0] << head->psevdonim[1] << head->psevdonim[2] << " -> " << head->b->psevdonim[0] << head->b->psevdonim[1] << head->b->psevdonim[2];
    head = head->b;
}

else if (boo == 'c') {
    cout << "\nc: " << head->psevdonim[0] << head->psevdonim[1] << head->psevdonim[2] << " -> " << head->c->psevdonim[0] << head->c->psevdonim[1] << head->c->psevdonim[2];
    head = head->c;
}

else if (boo == 'd') {
    cout << "\nd: " << head->psevdonim[0] << head->psevdonim[1] << head->psevdonim[2] << " -> " << head->d->psevdonim[0] << head->d->psevdonim[1] << head->d->psevdonim[2];
    head = head->d;
}
}

int char_to_int(char* boo) {
char* ptr1 = boo;
char* ptr2 = boo + 1;
int flag = 0;
if (*ptr1 == 'F') flag = 18;
else if (*ptr2 != '\0')
    flag = (*ptr1 - '0') * 10 + (*ptr2 - '0') + 1;
else
    flag = (*ptr1 - '0') + 1;
return flag;
}

void init_graph(point*& Points) {
// даем имена узлам
FILE* f1 = fopen("input.txt", "r");
if (f1 == nullptr) {
    cout << "Failed to open file 1" << endl;
    exit(1);
}
int pos = 6, kolEl = 0;
while (kolEl <= N) {
    char boo[4] = "";
    fscanf(f1, "%s", boo);
    if (pos % 6 == 0) {
        kolEl++;
        Points[kolEl] = (point)calloc(1, sizeof(Item));
        strcpy(Points[kolEl]->psevdonim, boo);
    }
    pos++;
}
fclose(f1);

// заполняем узлы данными
FILE* f2 = fopen("input.txt", "r");
if (f2 == nullptr) {
    cout << "Failed to open file 2" << endl;
    exit(1);
}
pos = 6, kolEl = 0;
while (kolEl <= N) {
    if (pos % 6 == 0) {
        char boo[4] = "";
        fscanf(f2, "%s", boo); pos++;
        kolEl++;
    } else {
        char booA[3] = "", booB[3] = "", booC[3] = "", booD[3] = "", booY[3] = "";
        fscanf(f2, "%s", booA); pos++;
        int way_a = char_to_int(booA);
        Points[kolEl]->a = Points[way_a];
        fscanf(f2, "%s", booB); pos++;
        int way_b = char_to_int(booB);
        Points[kolEl]->b = Points[way_b];
        fscanf(f2, "%s", booC); pos++;
        int way_c = char_to_int(booC);
        Points[kolEl]->c = Points[way_c];
        fscanf(f2, "%s", booD); pos++;
        int way_d = char_to_int(booD);
        Points[kolEl]->d = Points[way_d];
        fscanf(f2, "%s", booY); pos++;
        Points[kolEl]->YorN = (strcmp(booY, "Y") == 0);
    }
}
fclose(f2);
}

если кому то нужно попробовать запустить, вот данные из input.txt:

q0  2  1  4  1  Y
q1  2  1  4  1  Y
q2  3  2  6  2  Y
q3  10 3  7  3  Y
q4  6  4  5  4  Y
q5  8  5  11 5  Y
q6  7  6  8  6  Y
q7  15 7  9  7  Y
q8  9  8  16 8  Y
q9  12 9  13 9  Y
q10 F  10 15 10 Y
q11 16 11 F  11 Y
q12 F  12 14 12 Y
q13 14 13 F  13 Y
q14 F  14 F  14 Y
q15 F  15 12 15 Y
q16 13 16 F  16 Y 
F   F  F  F  F  N

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