Сосредоточьте ваше внимание на этой части кода:
if(hobbies[key] == NULL) {
hobbylist hob;
...
hobbies[key] = &hob;
}
Когда hob
выйдет из области видимости (в конце тела этого оператора if), hobbies[key]
будет ссылаться на то, что небольше не существует.
Позже в вашей программе, как вы правильно заметили, когда вы делаете cout << hobbies[i]->hobby;
, вы будете запрашивать hobby
для чего-то, что вышло из области видимости, что вызывает Неопределенное поведение (UB).
Некоторые возможные решения:
- Использование
std::map
вместо массива указателейВы используете сейчас.Контейнер автоматически позаботится об управлении памятью.(Рекомендуется) - Используйте умные указатели (например,
std::unique_ptr
) вместо необработанных указателей.Подробнее читайте в Что такое интеллектуальный указатель и когда его следует использовать? - Динамически выделяйте
hob
, так что его время жизни увеличивается (это означает, что когда тело этого оператора if завершается, hob
срок жизни не закончится).Этот подход требует, чтобы вы отвечали за управление памятью (вы должны отменить выделение каждого фрагмента памяти, который вы динамически выделяли ранее (вызывайте delete
столько раз, сколько вы вызывали new
)).