Проверка на nullptr указателя на функцию

Пытаюсь сделать проверку указателя на nullptr. Но она почему-то проходит, не срабатывает условие и контроллер уходит в перезагрузку, видимо, крашится.

Главный код:

VirtualEnv* env = new VirtualEnv();

void test_interrupt_call_null(){
    // функция должна вернуть false, т.к вызов не прошел из-за того, что указатель на функцию не определен
    bool result = env->callInterruptByPin(131);
    TEST_ASSERT_FALSE(result);
}

VirtualEnv.h:

typedef void (*InterruptFunction)();

class VirtualEnv: public IEnvironment
{
    public:
        virtual void setInterrupt(int pin, void(*callback)(), int mode);

        bool callInterruptByPin(int pin);
    private:
        int pins_state[54]; 
        InterruptFunction interruptCallbacks[24];
};

VirtualEnv.cpp:

void VirtualEnv::setInterrupt(int pin, void(*callback)(), int mode) 
{
    this->interruptCallbacks[pin] = callback;
}



bool VirtualEnv::callInterruptByPin(int pin) 
{
    InterruptFunction callback = this->interruptCallbacks[pin];

    // вот тут, видимо, callback nullptr проходит, вызывается callback() на nullptr и контроллер перезагружается
    if (callback != nullptr && *callback != nullptr && callback != NULL && *callback != NULL){
        callback();

        return true;
    }

    return false;
}

Пожалуйста, помогите


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

Автор решения: Swift - Friday Pie

прошу прощения , но

 bool result = env->callInterruptByPin(131);

обращается к 132му элементу массива , тогда как их 24. Какое значение там в памяти, одному Ктулху известно.

По поводу инициализации. Первой строчки VirtualEnv* env = new VirtualEnv(); достаточно только если у класса и его родителя нет конструкторов. Если же у родителя конструктор есть, следует продекларировать свой:

 VirtualEnv() : IEnvironment{}, pins_state{}, interruptCallbacks{} {}

Если компилятор не поддерживает С++11, такое не пройдет. Но можно определить свой тип указазателя , который себя инициализирует или использовать std::function

→ Ссылка