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

ESP32 C++中对象指针丢失问题求助

问题根源与修复方案

问题核心原因

你在Sim800Cls::init()方法中创建的PruebaCls是局部栈对象——当init()方法执行完毕后,这个局部对象会被自动销毁,其占用的内存空间会被系统回收或重新分配。

如果Sim800Cls中保存了这个局部PruebaCls对象的指针,后续在init()外部调用method1时,这个指针已经变成了野指针(指向已销毁的对象),此时访问它的_GsmSerial成员自然会触发异常,看起来像是“丢失了串口指针”,本质是整个PruebaCls对象已经不存在了。


修复方案

方案1:将PruebaCls改为Sim800Cls的成员变量

在Sim800Cls类中直接声明PruebaCls的成员(指针或实例),确保其生命周期与Sim800Cls实例一致:

class Sim800Cls {
private:
    PruebaCls* _pruebaObj; // 用指针存储,动态分配内存
    SoftwareSerial* _gsmSerial;
public:
    void init(SoftwareSerial* serial) {
        _gsmSerial = serial;
        _pruebaObj = new PruebaCls(); // 动态创建对象,生命周期由自己控制
        _pruebaObj->setSerial(_gsmSerial); // 传递串口指针
        _pruebaObj->method1(); // 此时对象有效
    }

    // 记得在析构函数中释放内存,避免内存泄漏
    ~Sim800Cls() {
        if (_pruebaObj != nullptr) {
            delete _pruebaObj;
            _pruebaObj = nullptr;
        }
    }

    void callMethod1() {
        _pruebaObj->method1(); // 此时对象依然有效
    }
};

方案2:让PruebaCls的生命周期覆盖method1的调用周期

如果PruebaCls不需要长期存在,也可以:

  • 将PruebaCls声明为Sim800Cls的静态成员
  • 在main函数中创建PruebaCls实例,再传递给Sim800Cls保存指针,确保在调用method1时该实例未被销毁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:05:57