Программа завершает работу успешно через раз. Необработанное исключение по адресу. В чем может быть проблема?

Если вкратце, то имеется класс человека, который заселяется в отель. Из этого класса нужно сделать хеш-таблицу. Возникла проблема, некоторые объекты класса добавляются в хэш таблицу, некоторые вызывают какие то исключения в VS 2019. Cам код:

Класс гостя с конструктором:

using namespace std;

enum state { empty, deleted, used };//Константы для заполнения состояния ячейки
class guest
{
public:
    char pasport[12];
    string name;
    int birthyear;
    string adris;
    string purpose_of_travel;
    guest* head;//Указатель на голову списка
    guest* next;//Указатель на следующий элемент списка при возникновении коллизии
    int st;//Состояние ячейки
    guest(const char *pasport_m = "8015-175572", const string name_m = "No Name",
        const int birthyear_m = 0, const string address_m = "No Adress",
        const string purpose_of_travel_m = "No Info" , const int st_m=0,   guest *next_m=NULL, guest* head=NULL);
};

#include "guest.h"

guest::guest(const char* pasport_m , const string name_m ,
    const int birthyear_m , const string address_m ,
    const string purpose_of_travel_m , const int st_m,  guest* next_m, guest *head_m)
{
     for (int i = 0; i<12; i++)
    {
        pasport[i] = pasport_m[i];
    }
    name = name_m;
    birthyear= birthyear_m;
    adris = address_m;
    purpose_of_travel = purpose_of_travel_m;
    st = st_m;
    next = next_m;
    head = head_m;
}

И само создание хеш таблицы:

#pragma once
#include <iostream>
#include "guest.h"


struct HashTable
{

    guest* arr;//Массив структур
    int size;//Размер структуры
};
void init(HashTable*&h, int size);//Создание хэш-таблицы
void delTable(HashTable*& h);//Удаление таблицы
bool equall(char* a, char* b);
void show(HashTable*& h);
void addHashTable(HashTable*& h, guest* cur_guest);

Непосредственно метод init, который ее инициализирует:

void init(HashTable*& h, int size_m)//Создание хэш-таблицы и заполнение ее значениями по умолчанию
{
    h = new HashTable;
    h->size = size_m;
    h->arr = new guest[size_m];
    
}

Метод добавления элемента

void addHashTable(HashTable*& h, guest* cur_guest)
{
    int cur_hash = MyHash(cur_guest->pasport) & h->size;//Получаем текущее значение ключа
    if (h->arr[cur_hash].st == state::used && equall(cur_guest->pasport, h->arr[cur_hash].pasport))
    {
        cout << "Этот ключ уже содержится в таблице в ячейке под номером " << cur_hash << '\n';
        return;
    }
    else if (h->arr[cur_hash].st != state::used)
    {

        h->arr[cur_hash].name = cur_guest->name;
        h->arr[cur_hash].adris = cur_guest->adris;
        h->arr[cur_hash].birthyear = cur_guest->birthyear;
        h->arr[cur_hash].next = NULL;
        for (int i = 0; i < 12; i++)
        {
         h->arr[cur_hash].pasport[i] = cur_guest->pasport[i];
        }
        h->arr[cur_hash].purpose_of_travel = cur_guest->purpose_of_travel;
        h->arr[cur_hash].st = state::used;
        h->arr[cur_hash].head = &h->arr[cur_hash];
        cout << "Гость с номером паспорта " <<cur_guest->pasport<< " успешно добавлен в ячейку под номером "
            << cur_hash << "\n";
        return;
    }
    else if (h->arr[cur_hash].st == state::used && !equall(cur_guest->pasport, h->arr[cur_hash].pasport))
    {
        guest* tesst = &h->arr[cur_hash];
        do
        { 
            if (equall(cur_guest->pasport, tesst->pasport))
                return;
            if (tesst->next == NULL)
            {
                guest* temp;
                temp = (guest*)malloc(sizeof(guest));
                tesst->next = temp;
                temp->name = cur_guest->name;
                temp->adris = cur_guest->adris;
                temp->birthyear = cur_guest->birthyear;
                temp->next = NULL;
                strcpy(temp->pasport, cur_guest->pasport);
                temp->purpose_of_travel = cur_guest->purpose_of_travel;
                temp->st = state::used;
                cout << "Гость с номером паспорта " << cur_guest->pasport << " успешно добавлен в ячейку под номером "
                    << cur_hash << "\n";
                break;
            }
            tesst = tesst->next;
            
        }
        while (tesst->next != NULL);
    }

}

И вот непосредственная тестировка. Создание нескольких объектов класса guest и дальнейшее их добавление:

#include <iostream>
#include "HashTable.h"

int main()
{
    system("chcp 1251");
    system("cls");
    HashTable *h=NULL;
    init(h, 10);
    show(h);
    const char* namee = "8015-172542";
    const char* lala = "Алексей Валерьев";
    const char* sdfs = "8352-890313";
    const char* sdfsq = "Никита Гусев";

    guest *low1=new guest(namee, lala, 0,  "No Adress", "No Info",  0, NULL, NULL);
    addHashTable(h, low1);
    guest* dfsd = new guest(sdfs, sdfsq, 0, "No Adress", "No Info", 0, NULL, NULL);
    addHashTable(h, dfsd);
    show(h);

    
}

При пошаговой компиляции выскакивает ошибка Необработанное исключение по адресу 0x515440C9 (vcruntime140d.dll) в SAOD_KP.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0xCDCDCDCD. Когда меняю паспортные данные, на другие (рандомные) иногда все проходит успешно. Иногда нет. С чем может быть связано?


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