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

C++子类对象指针使用异常问题求助

问题原因分析及排查方向

1. 野指针/指针悬空

如果setButton传递的tft指针指向的Adafruit_RA8875对象生命周期短于sceneLoad数组里的Button对象,就会出现指针悬空。比如tft是局部变量,直接调用时变量还在栈上有效,但Scenes类调用时该变量已被销毁,此时Button内的指针指向无效内存,调用printButton时触发崩溃。

2. 浅拷贝导致的指针共享问题

sceneLoad数组若通过默认拷贝构造创建Button对象,而你的Button类未实现自定义拷贝构造与赋值运算符,默认浅拷贝会让多个Button共享同一个tft指针。一旦原tft对象失效,或某个Button操作导致指针指向的内存被释放,所有共享该指针的Button调用方法都会崩溃。之前用引用时,编译器会限制非法拷贝,不会出现这类问题。

3. 指针未正确初始化

若sceneLoad数组的Button对象在setButton调用前就完成初始化,此时tft指针为空或指向随机内存。直接调用时你可能已经完成了指针赋值,但Scenes类调用的是未正确初始化的Button对象,解引用空指针直接触发崩溃。

4. 硬件资源访问冲突(概率较低)

改用指针后,若Scenes类调用printButton时,其他线程或代码正在操作tft硬件资源,可能引发访问冲突导致崩溃,但这种情况需要结合硬件操作逻辑排查。

排查建议

  • 确认tft对象的生命周期:将tft声明为全局变量,或确保其生命周期覆盖Scenes类与Button对象的整个使用周期。
  • 修复Button类的拷贝逻辑:手动实现拷贝构造函数与赋值运算符,确保指针指向有效对象;或改用std::shared_ptr这类智能指针管理tft对象,避免悬空。
  • 打印指针地址验证:在setButton、直接调用、Scenes调用三个时机分别打印tft指针的地址,确认是否一致、是否为空。
  • 调整初始化顺序:确保setButton在sceneLoad数组初始化完成后调用,或在数组初始化时直接完成tft指针的赋值。

内容的提问来源于stack exchange,提问作者LastHerd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:40:19