Arduino类中成员对象指针构造后参数值异常,求正确实现方案
问题分析与解决方案
你的问题核心很明确:你把指针变量直接用整数初始化了,根本没创建MyObjClass的实例!
为什么会出现垃圾值?
你写的MyClass::MyClass(const int param): my_obj(param)这行代码,本质是把param这个整数直接强转成了MyObjClass*类型的指针地址——相当于让my_obj指向内存中地址为param的位置,但这个位置根本不是你要的MyObjClass实例,里面的内容自然是随机的垃圾值。
另外还要提一句:你原来的类定义多了不必要的括号(比如class MyObjClass()),这是语法错误,正确写法是class MyObjClass { ... };。
正确的实现方式
根据你的需求,这里有几种靠谱的方案:
方案1:动态分配对象(指针方式,需手动管理内存)
如果确实需要用指针(比如需要延迟初始化或者多态场景),你得用new来创建MyObjClass的实例,把返回的地址赋值给指针:
// 修正后的MyObjClass class MyObjClass { const int param; public: MyObjClass(const int param) : param(param) {} }; // 修正后的MyClass class MyClass { MyObjClass *my_obj; public: // 正确用new创建实例 MyClass(const int param) : my_obj(new MyObjClass(param)) {} // 必须加析构函数释放内存,避免泄漏 ~MyClass() { delete my_obj; } // 可选:禁用拷贝构造和赋值运算符(防止浅拷贝导致的重复释放) MyClass(const MyClass&) = delete; MyClass& operator=(const MyClass&) = delete; };
方案2:直接用成员对象(更安全,无需手动管理内存)
如果不需要动态分配,完全可以把MyObjClass作为MyClass的直接成员,这样在初始化列表里直接初始化即可,代码更简洁安全:
class MyObjClass { const int param; public: MyObjClass(const int param) : param(param) {} }; class MyClass { // 直接定义成员对象,不是指针 MyObjClass my_obj; public: // 直接在初始化列表里初始化成员对象 MyClass(const int param) : my_obj(param) {} };
这种方式下,MyClass构造时会自动调用MyObjClass的构造函数,const int param会被正确初始化,而且不用操心内存释放的问题,是优先推荐的写法。
方案3:用智能指针(C++11及以上支持)
如果你的Arduino环境支持C++11或更高版本,还可以用std::unique_ptr来自动管理内存,避免手动delete的麻烦:
#include <memory> class MyObjClass { const int param; public: MyObjClass(const int param) : param(param) {} }; class MyClass { std::unique_ptr<MyObjClass> my_obj; public: MyClass(const int param) : my_obj(std::make_unique<MyObjClass>(param)) {} // 不需要手动写析构函数,unique_ptr会自动释放内存 };
内容的提问来源于stack exchange,提问作者user2980891
相关产品推荐
相关产品推荐

