带有类指针的If语句导致段错误

If statement with a class pointer is causing a segfault

本文关键字:段错误 错误 语句 指针 If      更新时间:2023-10-16

我已经为我正在做的一个小c++项目创建了一个有限状态机类,但是由于某种原因,程序一旦到达某个if语句就会出现分段错误。

下面是类本身:

class FiniteStateMachine
{
protected:
    void cleanup();
    State* state_;
public:
    FiniteStateMachine();
    FiniteStateMachine( State* const state );
    ~FiniteStateMachine();
    void changeState();
    void forceState( State* const state );
    char const* getStateName();
};

在定义中,程序一旦到达条件语句,就会出现分段错误:

void FiniteStateMachine::changeState()
{
    debugging("FiniteStateMachine::changestate() called");
    if( state_ ) // problem point
    {
        debugging("state_ is not nullptr");
        // state_.handle();
    }
    else
    {
        debugging("state_ is nullptr");
    }
}

debugging()只是一个函数,用于在调试模式下向标准输出显示消息。对我来说最奇怪的是if(state_)在程序的早期使用没有任何问题。

我使用gcc版本4.9.2,Linux Mint 17.2和c++ 11

如果你需要更多的细节,这里是github存储库的链接。

你的问题的根源是你的Engine::getInstance方法有一个bug。

Engine* Engine::getInstance()
{
    Engine* instance = instance_;
    if( !instance_ )
    {
        instance_ = new Engine;
    }
    return instance;
}

第一次调用这个方法时,总是返回null。您应该删除本地Engine变量,只使用instance_成员。

Engine* Engine::getInstance()
{
    if( !instance_ )
    {
        instance_ = new Engine;
    }
    return instance_;
}
这将修复导致if语句崩溃的空指针