c++ 构造函数初始化为NULL

if(_stat != NULL)判断的时候,_stat始终为NULL,没有初始化成功

class GooseStatInfo {
private:
    std::string _custom;
 
public:
    void setCustom(const std::string& str) {
        _custom = str;
        //debug 编译到此处str为字符串,this 值为NULL
    }
 
    std::string getToString() {
        Serial gs;
        gs.update(_custom);
 
        // ... other codes
    }
};
class ABRInt {
private:
    GooseStatInfo* _stat;
    ABRInt(): _As(...), _bs(...) {}
    ABRInt(const ABRInt& other) = delete;

    ABRInt& operator=(const ABRInt& other) = delete;
    ~ABRInt() = default;


    ABRInt(ABRConfig& config, GooseStatInfo* s) {
        _stat = s;
 
        // ... other codes
    }


 
    void onEvent(const std::shared_ptr<ABREvent>& event) {
        std::string results = ABRCustC::getStatInfo();
        //需要把results的结果发到_custom,ABRCustC::getStatInfo()返回的结果为str类型,做了c.str()处理
         if(_stat != NULL){
             _stat->setCustom(results);
             //_stat初始化有点不对,这里_stat一直为NULL,没有初始化成功
          }
        
        
        // ... other codes
    }
};

啥意思

参考ChatGPT
根据您提供的代码片段,无法确定_stat是何种类型的变量,它是在哪里声明的,以及为什么在if语句中判断失败。但是,从您提供的代码中可以看出,您的类中没有与_stat相关的任何代码。因此,我建议您检查代码中是否存在其他与_stat相关的变量或代码,并查看它们是否正确初始化。

此外,根据您的描述,如果在setCustom方法中,参数str的值正常,但是this指针的值为NULL,那么很可能是因为您没有正确初始化该对象。请确保在使用对象之前正确地创建并初始化它。

参考GPT的回答内容和自己的思路,在ABRInt类的构造函数中,可以通过成员初始化列表对指针变量_stat进行初始化,例如:

ABRInt(ABRConfig& config, GooseStatInfo* s): _stat(s) {
    // ... other codes
}


这样,在对象构造时,_stat指针就会被初始化为传入的指针s的值,避免了未初始化的问题。

此外,建议在类的析构函数中,对成员变量_stat进行判断和释放,避免出现内存泄漏的情况,例如:

~ABRInt() {
    if (_stat != nullptr) {
        delete _stat;
        _stat = nullptr;
    }
}


这样,在对象被销毁时,如果_stat指针不为nullptr,则会被释放掉,避免内存泄漏。
回答不易,还请采纳!!!

你的代码中 _stat只在构造 ABRInt(ABRConfig& config, GooseStatInfo* s) 中赋值了,如果没有使用这个构造,那么 _stat始终没有赋值。

在代码中,没有明确地初始化 _stat 指针。所以当判断 _stat 是否为 NULL 时,它的值始终为 NULL。需要在 ABRInt 的构造函数中为 _stat 成员变量分配内存并初始化。

在代码中没有看到 _stat 成员变量的初始化,因此在使用 _stat 前需要对其进行初始化。一种方式是在类的构造函数中对 _stat 进行初始化,例如:

ABRInt(ABRConfig& config, GooseStatInfo* s) : _stat(s) {
    // ... other codes
}

在这种情况下,类的构造函数将使用传入的 s 参数来初始化 _stat 成员变量。

另外,需要注意 _stat 变量的类型为指针类型,因此在使用 _stat 时需要先判断其是否为 NULL,如果为 NULL 则表示指针未指向任何内存空间,此时使用 _stat 会导致程序崩溃。因此,可以在调用 setCustom 函数之前,添加对 _stat 的 NULL 检查,例如:

if (_stat != NULL) {
    _stat->setCustom(results);
}

这样就可以避免在 _stat 未初始化时调用 setCustom 函数导致程序出错的问题。

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^