При использовании database[index].accID = accID;
вы делаете только поверхностную копию (и полагаетесь на то, что вызывающая сторона сохраняет эту память действительной, так как указатель может быть доступен).
Вы правильно определили, что вам нужно предварительно сформировать глубокое копирование, но client::accID
- это просто указатель, но вы не можете копировать в него, пока не инициализируете его, чтобы указать на некоторую память.
Один из способов сделать это - динамически распределять и управлять client::accID
, аналогично тому, как вы динамически распределяете и управляете client::history
.
Вместо strcpy (database[index].accID , accID );
или database[index].accID = accID;
, попробуйте:
size_t bufsize = strlen(accID) + 1;
char *buf = new char[bufsize];
memcpy(buf, accID, bufsize);
database[index].accID = buf;
и в деструкторе добавить:
delete[] database[i].accID
Как уже отмечали другие, этот стиль программирования на C ++ очень подвержен ошибкам и плохо рассматривается сообществом. Этого ручного управления памятью можно легко избежать с помощью стандартных библиотечных классов. Даже после внесения изменений, указанных выше, ваша программа будет работать неопределенно, если вы начнете копировать CBank
объекты.
Даже если вам не нужно выполнять это задание, попробуйте переписать это как упражнение с:
std::string
вместо C -строки для accID;
std::vector
вместо data_history
массива
Также к вашему сведению:
if (database[i].accID == input )
Не будет делать то, что ожидается с c -струны ...