Проблема здесь в том, что function<void()> const &callback;
не продлевает жизнь временного std::function
, который генерируется из
btn = new Button([=]() {
//cout << "you clicked the button" << endl;
buttonClicked();
});
Лямбда не является std::function
, поэтому, когда вы делаете вышевременный std::function
генерируется.Затем вы привязываетесь к этому временному с помощью callback
, но const&
переменные-члены не продлевают время жизни временного, с которым они связываются.Только функция local const&
получает такое поведение.Это означает, что при выходе из конструктора VideoPreview
у вас остается кнопка, имеющая ссылку на функцию для уничтоженного объекта.
Чтобы исправить это, просто сохраните callback
по значению, подобному
class Button {
private:
function<void()> callback;
public:
Button(function<void()> c) : callback(std::move(c)) {
cout << "created Button" << endl;
callback(); // THIS CALL WORKS FINE
}
void update() {
// if(clicked)...
callback(); // works now.
}
};