You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:45:04