= new Fl_Double_Window(480, 320);
w = o; (void)w;
{ Fl_Button* o = new Fl_Button(25, 25, 424, 22, "Fl_Button");
o->callback((Fl_Callback*)click);
} // Fl_Button* o
o->end();
} // Fl_Double_Window* o
return w;
}
Здесь переменная , объявляется и появляется код в фигурных скобках. Как это вообще? Где об этом прочитать? Как такое называется?
https://en.cppreference.com/w/cpp/language/scope
Разобрался. Но зачем вообще создавать отдельную переменную o ? Это какой-то паттерн? Есть где об этом почитать?
Это автоматическая переменная, существует только внутри блока кода. Переменная с одним и тем же названием и типом данных, но в разных блоках кода никак не связаны между собой.
Я понял, но зачем? Почему не использовать w на прямую?
Это хорошая практика объявлять переменную как можно ближе к месту использования и по максимуму ограничивать её область видимости. Насчёт w и o не знаю, не особо понимаю из-за форматирования что там и зачем.
это странный код не надо так
Это автоматическая генерация для пользовательского интерфейса FLTK
Так я так понимаю, мнение на счёт такое реализации разнятся?
Ты о коде или распространённой практике?
О том, имеет ли это смысл
Мнения и ситуации могут быть разными, а объективные плюсы и минусы всегда одни. По крайней мере не засорять область видимости лишними переменными и ограничивать временные переменные местом их использования это однозначный плюс так делать.
Да, согласен. Но за очисткой всё равно придётся следить. Ведь как только он покинет область видимости, это по идее, утечк памяти
Не правда, только для динамической памяти. Переменные на "стеке" — автоматические по этому так и называются, что тебе не надо вручную выделять и освобождать память под них. Эту работу берёт на себя компилятор.
В данный момент кнопка Fl_Button всё ещё остаётся в куче, потому я так понимаю она и остаётся на окне w даже после покидания области память, но ведь очистить теперь её никак нельзя, разве нет?
Не знаю, надо читать документацию к библиотеке.
В данном случаи, это именно динамическое выделение памяти
Да, но вдруг там есть передача владения или что-то такое. Или разработчики библиотеки решили в конструкторе все динамические объекты добавлять в вектор, чтобы в конце работы за тебя освободить динамическую память?
Ладно, спасибо за помочь
Утром, может быть, люди поопытнее ещё что-нибудь скажут или меня поправят.
Это паттерн "утечка памяти"
По данному коду нельзя, но возможно сама Эта библиотека имеет какие-то возможности отслеживания этой динамической памяти и корректного удаления этих объектов
Обсуждают сегодня