У меня есть небольшая текстовая игра, над которой я работаю, и у меня есть функция, которая в основном заканчивает игру, если пользователь выбирает эту опцию через эту строку кода:
void MainMenu::Exit()
{
std::exit(0);
}
Это хорошо и все, но вызван деструктор MainMenu, который содержит вызов удаления указателю, который я создал с новым ключевым словом (поэтому я думаю, что мне нужно вручную удалить объект перед выходом из программы). Объектом является мой мировой класс, который создается, когда пользователь выбирает игру. Однако пользователь может выйти из главного меню до создания указателя мира, поэтому компилятор не знает, на что указывает указатель. Я попытался изменить деструктор, чтобы увидеть, был ли объект мира NULL, например:
MainMenu::~MainMenu()
{
if(world != NULL)
delete world;
}
Но я все еще получаю всплывающее окно, сообщающее мне, что моя программа перестала отвечать на запросы, и мне нужно вручную ее убить.
По сути мой вопрос в том, есть ли способ сказать, указывает ли указатель на что-то? Нужно ли мне вручную обрабатывать удаление указателя?
Да, в C++ вы должны убедиться, что каждое "новое" соответствует "удалить". В MainMenu ctor вы должны убедиться, что вы инициализируете мир NULL (или предпочтительно nullptr, если ваш компилятор поддерживает его):
MainMenu::MainMenu (/* more stuff here */) : world (nullptr)
{
// more stuff here
}
Кроме того, как указывает Крис, вам не нужно проверять значение NULL при удалении:
MainMenu::~MainMenu()
{
delete world; // no-op if world is null
}
Не знаю, почему ваша программа висит. Кажется, что он должен произойти, если вы не инициализируете "мир" нулевым.
Вы должны инициализировать указатель в конструкторах класса. Деструктор может быть записан без проверки того, равен ли указатель NULL или нет.
MainMenu::~MainMenu()
{
delete world;
}
Также гораздо лучше использовать стандартный интеллектуальный указатель, например, std::unique_ptr
world = NULL
после удаления, потому что это хорошая практика и может помочь OP поймать другие ошибки.
MainMenu
? Вы инициализируетеworld
с 0?