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
相关产品推荐
相关产品推荐

