C ++ пытается удалить указатель, который не существует

0

У меня есть небольшая текстовая игра, над которой я работаю, и у меня есть функция, которая в основном заканчивает игру, если пользователь выбирает эту опцию через эту строку кода:

void MainMenu::Exit()
{
    std::exit(0);
}

Это хорошо и все, но вызван деструктор MainMenu, который содержит вызов удаления указателю, который я создал с новым ключевым словом (поэтому я думаю, что мне нужно вручную удалить объект перед выходом из программы). Объектом является мой мировой класс, который создается, когда пользователь выбирает игру. Однако пользователь может выйти из главного меню до создания указателя мира, поэтому компилятор не знает, на что указывает указатель. Я попытался изменить деструктор, чтобы увидеть, был ли объект мира NULL, например:

MainMenu::~MainMenu()
{
    if(world != NULL)
         delete world;
}  

Но я все еще получаю всплывающее окно, сообщающее мне, что моя программа перестала отвечать на запросы, и мне нужно вручную ее убить.

По сути мой вопрос в том, есть ли способ сказать, указывает ли указатель на что-то? Нужно ли мне вручную обрабатывать удаление указателя?

  • 5
    Эта нулевая проверка избыточна.
  • 1
    Как выглядит ваш конструктор для MainMenu ? Вы инициализируете world с 0?
Показать ещё 5 комментариев
Теги:
pointers

2 ответа

0
Лучший ответ

Да, в 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
} 

Не знаю, почему ваша программа висит. Кажется, что он должен произойти, если вы не инициализируете "мир" нулевым.

  • 0
    Спасибо, я пришел с Java, где это опасно, но это решило проблему!
  • 0
    Я второй использование std :: unique_ptr. Просто объявите мир таким образом: std :: unique_ptr <WorldClass> world (new WorldClass); и удаление управляется для вас.
Показать ещё 1 комментарий
0

Вы должны инициализировать указатель в конструкторах класса. Деструктор может быть записан без проверки того, равен ли указатель NULL или нет.

MainMenu::~MainMenu()
{
         delete world;
} 

Также гораздо лучше использовать стандартный интеллектуальный указатель, например, std::unique_ptr

  • 0
    Можете ли вы уточнить, что такое умный указатель? Я читаю книгу по C ++, которая обновлена для C ++ 11, и до сих пор мне не говорили использовать ничего, кроме указателей (не «умной» версии).
  • 0
    Я бы добавил world = NULL после удаления, потому что это хорошая практика и может помочь OP поймать другие ошибки.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню