我正在为一个项目构建一个pubsub系统,我有一个有趣的问题,事件值在通知和事件发送之间变化.我遇到问题的事件是一个MouseMoveEvent,其中包含使用glm :: vec2()的屏幕坐标(它有双重类型的x和y字段).
template<class E>
void notify_event(std::shared_ptr<E> event) {
if (_auto_dispatch) {
dispatch<E>(event);
} else {
// inspecting values here gives expected coordinates:
// like: 168.684,284.547
debug<E>(event);
_dispatch_queue.push([&]() {
// when the lambda runs, the coordinates are major messed up
// like: -1.82767e+16,4.57398e-41
debug<E>(event);
dispatch<E>(event);
});
}
}
Run Code Online (Sandbox Code Playgroud)
无论输入值如何,都给出-1.82767e + 16,4.57398e-41坐标.我最初使用引用传递事件,然后尝试共享指针,但我得到两个完全相同的结果.调度事件立即运行没有任何问题,但我的项目要求我收集事件,然后稍后调度,因为不同的系统将在创建事件时处于"准备好"的各种状态.
我觉得捕获的事件引用最终以某种方式指向垃圾内存,但我不太清楚C++中的lambdas,知道我为什么会看到它.
发生了什么事,有什么选择可以解决这个问题?
似乎lambda将在notify_event函数返回后被调用,这意味着参数event将超出范围并且引用将无效.
虽然肯定会有一些用例,应该通过引用传递(或捕获)共享指针,但这似乎不是其中之一.通过值捕获它,以便lambda将拥有自己的共享指针,该指针始终有效(即使在最后一个实例被破坏之后).