Далеко не ясно, что у вас стек повреждение.Но я допускаю, что существует некоторая порча данных.
Достаточно эффективным методом является добавление защитных полей вокруг подозрительных полей:
...
long namecheck1;
Artist artist;
long namecheck2;
...
Пусть конструктор инициализирует их для чего угодно,но не зная природу искажения, что-то ненулевое кажется более удовлетворительным.
myclass::myclass() : namecheck1(0x12345678), namcheck2(0x12345678) ...
Добавьте функцию-член проверки согласованности:
void myclass::isokay()
{
if (namecheck1 != namecheck2 ||
namecheck2 != 0x12345678)
cerr << "the object is corrupted";
... // maybe wait for input, cause core dump, etc.
}
Затем добавьте код с вызовами этого,особенно рядом с подозрительной логикой.Если вам удобен отладчик, поместите точку останова в сообщение об ошибке.Раскрывая стек, вы можете выяснить, что программа недавно сделала, и собрать подсказки относительно того, какой фрагмент кода, вероятно, пишет за пределами границ.