Проверка на 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 шт):
прошу прощения , но
bool result = env->callInterruptByPin(131);
обращается к 132му элементу массива , тогда как их 24. Какое значение там в памяти, одному Ктулху известно.
По поводу инициализации. Первой строчки VirtualEnv* env = new VirtualEnv(); достаточно только если у класса и его родителя нет конструкторов. Если же у родителя конструктор есть, следует продекларировать свой:
VirtualEnv() : IEnvironment{}, pins_state{}, interruptCallbacks{} {}
Если компилятор не поддерживает С++11, такое не пройдет. Но можно определить свой тип указазателя , который себя инициализирует или использовать std::function