C++代码调用onMouseHover时selected指针为何恒为0xFFFFFFFF?
问题原因
- 核心故障来自lambda的捕获逻辑错误:你使用引用捕获语法
[&]捕获了InitSprite函数内的局部变量selected selected是分配在函数栈帧上的指针变量,当InitSprite执行完成后栈帧回收,selected变量本身的内存就会被释放- 绑定到
Sprite对象的回调lambda生命周期远长于InitSprite的执行周期,回调触发时lambda持有的是已经销毁的selected变量的野引用,访问时自然会读到非法值,你遇到的0xFFFFFFFF就是典型的野内存访问结果
注意:你通过
new分配的bool值本身是堆内存,生命周期正常,也已经存入selectedContainer,出问题的是栈上的指针变量本身,不是它指向的堆内存。
修复方案
将lambda的捕获方式改为值捕获,直接拷贝selected指针的数值即可:
extern std::vector<bool*> selectedContainer; inline void InitSprite(Sprite* sprite) { bool* selected = new bool(false); // 改为值捕获selected指针 sprite->onMouseHover = [selected](){ *selected = true; }; sprite->onMouseNotHover = [selected](){ *selected = false; }; selectedContainer.push_back(selected); }
值捕获会把selected指针当前存储的堆内存地址拷贝到lambda的内部成员中,完全不依赖原栈上的局部变量,后续回调触发时访问的地址就是合法的堆内存地址。
内容的提问来源于stack exchange,提问作者user13455484
相关产品推荐
相关产品推荐

