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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:02:28