Программа завершает работу успешно через раз. Необработанное исключение по адресу. В чем может быть проблема?
Если вкратце, то имеется класс человека, который заселяется в отель. Из этого класса нужно сделать хеш-таблицу. Возникла проблема, некоторые объекты класса добавляются в хэш таблицу, некоторые вызывают какие то исключения в 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. Когда меняю паспортные данные, на другие (рандомные) иногда все проходит успешно. Иногда нет. С чем может быть связано?