Segmentation fault при вызове функции из оболочки function
Всем доброго времени суток. Пытаюсь написать callback механизм (стандарт С++11). На данный момент столкнулся с проблемой сохранения метода с параметрами в оболочку std::function, точнее проблема в том, что она сохраняется, но при вызове в .cpp падает. Смотрел по дебагу, там затирается pointer на метод, но при этом ссылка на объект, которому принадлежит метод, и его аргументы живы.
Еще интересный факт, если вызвать сразу же после std::bind "контейнер" с методом, то все работает как надо.
public:
template <class Function, class... Args>
void callback(Function &&f, Args&&... args)
{
m_callback = std::bind(std::forward<Function>(f), std::forward<Args>(args)...);
// m_callback(); // Если вызвать, то все окей, если вызвать это в .cpp, то валится
}
Ответы (1 шт):
Проблема заключалась в невнимательности... В файле qiBase.cpp я подписался на сигнал watcher'a finished и в лямбде вызывал сигнал Cpromise::finished, который вызывал удаление объекта из чего следовало, что дальнейший вызов callback приводил к чтению из удаленного объекта.
// Connect в объекте promise
connect(m_pWatcher, &QFutureWatcher<bool>::finished, this, [=] {
// emit finished(); // Приводило к удалению объекта, который хранит callback
call_callback(); // поэтому сначала отработать callback, затем emit
emit finished();
});
...
// Connect в таскере с картой задач типа CPromise
connect(promise, &CPromise::finished, this, [=] {
m_mapTasks.remove(promise);
delete promise;
});