Я просто наткнулся на то, что я не смог сделать в c++ (я его изучаю)
Я вызвал нестатические функции без инициализации объекта класса (singleton class) или wtf happend, im не понимая его, это было NULL, и так, как я это делал,
мой пример одного синглтона:
class LightsLogic {
public:
void LightsLogic::request_color_shift_group_after_x_msecs(blabla);
int current_used_chase_list = 0;
// ALL THE SINGLETON CLASS THING BELOW
private:
LightsLogic() { // CONSTRUCTOR HERE !
};
LightsLogic(LightsLogic const&); // Don't Implement. // SINGLETON
void operator=(LightsLogic const&); // Don't implement // SINGLETON
public:
static LightsLogic& getInstance() // return reference. // SINGLETON
{
static LightsLogic instance;
return instance;
}
};
поэтому где-то я определил:
static LightsLogic* logicofligths;
и затем я назвал метод из этого класса
logicofligths->request_color_shift_group_after_x_msecs(blabla);
теперь, что случилось - этот метод использовал переменную:
void LightsLogic::request_color_shift_group_after_x_msecs(blabla) {
current_used_chase_list; // i am doing something with this variable
//but since this variable was defined and initialized in class header
// and this == null, this method CANT acces this variable ?! but it thinks it can ?!
//we do get a crash saying: First-chance exception at 0x013F5E8B in myexe.exe: 0xC0000005: Access violation reading location 0x00028D48.
// and if we would use this check before accesing the variable :
if (this == NULL) {
report("this is null");
return;
}
//this would prevent the crash.
}
теперь правильный способ доступа к методу этого одноэлементного класса без его разрушения:
(&LightsLogic::getInstance())->request_color_shift_group_after_x_msecs(blabla);
//i know i could just use LightsLogic::getInstance(). but that im using for accesing variables, more clear for me and compiler should fix this misery on compile ?!
почему я мог это сделать и что я делал неправильно? Или это не случай делать что-то неправильно, и я просто злоупотреблял некоторой памятью и получал "неопределенное поведение"? потому что это был мой первый удар.
смешная часть - приложение работает, если я не использую переменные, определенные в заголовке класса этого метода.
Вызов с помощью nullpointer имеет Undefined Behavior.
Ничего не может произойти.