злоупотребление синглтон-классом, c ++ - требуется объяснение

0

Я просто наткнулся на то, что я не смог сделать в 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 ?!

почему я мог это сделать и что я делал неправильно? Или это не случай делать что-то неправильно, и я просто злоупотреблял некоторой памятью и получал "неопределенное поведение"? потому что это был мой первый удар.

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

Теги:

1 ответ

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

Вызов с помощью nullpointer имеет Undefined Behavior.

Ничего не может произойти.

  • 0
    что-то тоже ничего не определяет, не так ли? так что просто используя статические LightsLogic * logicofligths; я получил доступ к классу неправильно? почему это позволило мне сделать это? : |
  • 0
    Нет способа ограничить разрешенные операции с указателем. Значение указателя, даже если оно известно, не считается первым. сборник. Но компилятор может предупредить об этом, если вы повысите уровень предупреждения. Я бы попробовал это.

Ещё вопросы

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