Объявил переменную классового типа, не создал экземпляр... однако проверка на пустоту не проходит

Всем привет, я новичок в С++, помогите пожалуйста с одной проблемой. У меня есть класс (например class Human) и я объявляю переменную типа этого класса, однако не создаю его экземпляр (объект) сразу. Это происходит в рандомный момент. Так же я знаю, что если ссылка не указывает на объект, и попытаться как-то с ней провзаимодействовать, это может привести к ошибке и вылету программы. Ставлю проверку на пустоту - она всё равно не срабатывает ((... вот примерно так это и выглядит:

class Human {
    int health = 90;
    bool isAlive() { return this->health > 0; }
};
int main () {
    Human* _man; // объявлен, но не создан
    while(true) {
        if(/*если нажата клавиша*/)
            _man = new Human();

        if(_man) {// проверка на "не пустоту"
            if(_man->isAlive()) {
                ....//какое-то действие над человеком
            }
        }
        if(/*если нажата другая клавиша*/)
            break;
    }
}

В if с проверкой на "не пустоту" я что только не ставил... И просто имя переменной подставлял, как на примере, и if(_man != nullptr), и if(_man != NULL)... и ни что не помогло, все равно валиться на этом... единственное что помогает - сразу объявлять переменную с nullptr... Human* _man = nullptr; Оно конечно не сложно, но есть ли какие-то способы и без значения какого либо отслеживать? Заранее благодарен.


Ответы (2 шт):

Автор решения: Harry

Ваше

Human* _man; // объявлен, но не создан

означает, что в _man хранится какое-то мусорное значение, указатель на какое-то случайное место в памяти. Отсюда и все ваши неприятности.

Неужели = nullptr такая большая цена за отсутствие ошибки?

И неужели компилятор не выдавал вам предупреждения об использовании потенциально неинициализированной переменной?

→ Ссылка
Автор решения: Serge3leo

единственное что помогает - сразу объявлять переменную с nullptr... Human* _man = nullptr; Оно конечно не сложно

Это единственный способ, грубо говоря, для POD типов нет конструкторов по умолчанию, и автоматические переменные не инициализированы.

но есть ли какие-то способы и без значения какого либо отслеживать?

Как вариант, использовать "умные" указатели unique_ptr, shared_ptr, ...:

...{
    std::unique_ptr<Human> _man;  // объявлен, но не создан
...
    // Создаём уникальный указатель на новый Human с конструктором без аргументов
    _man = std::make_unique<Human>();
...
    if (_man)
        ...
...}
// Если у _man указатель не изъяли, то удаляем Human при выходе из области видимости

Но они недаром умные, они умничают. Но, возможно, так как Вам в данном месте надо умничают?

→ Ссылка